java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : -1

标签 java arrays exception

我收到错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1

at SnakeBox.neighbor(SnakeBox.java:150)

at SnakeBox.findSnake(SnakeBox.java:86)

at pg6a.main(pg6a.java:28)

正在使用的类是:

/** This class can be used to manipulate 2D boxes of "snakes" for pg6.
 */
   import java.util.*;
   import java.io.*; 

 public class SnakeBox {

// instance variables
  private char[][] box;
  private int rows, columns;
  private int snakeCount;
  private int startRow, startCol;
  private int endRow, endCol;
    private boolean finish;
    private int x, y;
    private String toDisplay;

/** Create and initialize a SnakeBox by reading a file.
    @param filename the external name of a plain text file
*/
  public SnakeBox(String filename) throws IOException{
     Scanner filescan = new Scanner(new FileReader(filename));
     rows = filescan.nextInt();
        columns = filescan.nextInt();
        snakeCount = filescan.nextInt();
        filescan.nextLine();
        box = new char[rows][columns];
     for (int i=0; i < rows; i++) {
        String line = filescan.nextLine();
        for (int j=0; j < columns; j++) {
           char character = line.charAt(j);
           box[i][j] = character;
        }
     }  
  }

   /** Create a new snakebox of a given size and snake count
@param rows the height of the box
@param cols the number of columns
@param snakes how many snakes are in the box
    */
  public SnakeBox(int rows, int cols, int snakes) {
     this.rows = rows;
     this.columns = cols;
     this.snakeCount = snakes;

  }

/** Display the box on the screen.
 */
  public void display() {
     String toDisplay = ""; 
     for (int row = 0; row < rows; row++) {
        for (int column = 0; column < columns; column++) {
           toDisplay += box[row][column];
        }
        toDisplay += '\n';
     }  
        System.out.print(toDisplay);

  }

/** Find the next snake, skinning to change it from S to .
 */
  public void findSnake() {
    // check to make sure there are still snakes to skin
      if (finish = true) {              
    int row, col, nb;
    // find an S to search from
      outerloop:
      for (int k=0; k < rows; k++) {
          for (int l=0; l < columns; l++) {
          if (box[k][l] == 'S') {
          startRow = k;
          startCol = l;
          endRow = k;
          endRow = l;
          break outerloop;
          } 
      }
      }
    // set your initial S position to both start and end

    // search from end, updating it as you go
     do {
        nb = neighbor(endRow, endCol);
        switch (nb) {
           case 1: endRow--; endCol--; 
              break;
           case 2: endRow--; 
              break;
           case 3: endRow--; endCol++; 
              break;
           case 4: endCol--; 
              break;
           case 5: endCol++; 
              break;
           case 6: endCol--; endRow++; 
              break;
           case 7: endRow++; 
              break;
           case 8: endRow++; endCol++; 
              break;
        }
     } while (nb != 0);

    // search from start, updating it as you go
    do {
        nb = neighbor(startRow, startCol);
        switch (nb) {
           case 1: startRow--; startCol--; 
              break;
           case 2: startRow--; 
              break;
           case 3: startRow--; startCol++; 
              break;
           case 4: startCol--; 
              break;
           case 5: startCol++; 
              break;
           case 6: startCol--; startRow++; 
              break;
           case 7: startRow++; 
              break;
           case 8: startRow++; startCol++; 
              break;
        }
     } while (nb != 0);

    // update snake count
      snakeCount = snakeCount - 1;        
      //display start/end points of the snake, then display it
  }   
/** Change a position from S to . and find a neighboring S if one exists.
    @param x the row number of the position to change
    @param y the column number of the position to change
    @return 0 if no S neighbor was found, or a number from this grid 
    indicating the position of the found neighbor
           1 2 3
           4 S 5
           6 7 8
*/
  }
    private int neighbor(int x, int y) {
       box[x][y] = '.';

        if (box[x--][y--] == 'S') 
        return 1;

        if (box[x--][y] == 'S') 
        return 2;

        if (box[x--][y++] == 'S')
        return 3;

        if (box[x][y--] == 'S') 
        return 4;

        if (box[x][y++] == 'S') 
        return 5;

        if (box[x++][y--] == 'S') 
        return 6;

        if (box[x++][y] == 'S') 
        return 7;

        if (box[x++][y++] == 'S') 
        return 8;

        else        
     return 0;     

    }

/** Display the endpoints of the snake most recently skinned.
 */
  public void printEnds() {
  System.out.print("(" + x + "," + y + ")");
  }

/** Find out how many full snakes are in the box.
    @return the snake count
*/
  public int getCount() {
    return snakeCount;      
  }

/** Check whether all the snakes have been skinned, based on the snake count.
    @return true if done, false otherwise
*/
  public boolean finished() {
    if (snakeCount == 0) {
    finish = true;
    }
    else {
    finish = false;
    }      
    return finish;
  }

   }

此外,驱动程序(pg6)是:

 import java.util.*;
 import java.io.*;

 public class pg6a {

  public static void main(String[] args) throws IOException {
     Scanner keyboard = new Scanner(System.in);

     System.out.println("Please enter the name of the file where your snake box resides, and we will try our very best to eliminate all the snakes in your snake box!");
     String filename;
     filename = keyboard.nextLine();
     SnakeBox snakes = new SnakeBox(filename);
     snakes.display();

     while (snakes.finished() == false) {
        snakes.findSnake();
        snakes.printEnds();
        snakes.display();
        System.out.print(snakes.getCount());
     }                      
  }
}

最佳答案

这是因为 neighbor() 中的那些 if 语句。

if (box[x--][y--] == 'S') - 无论其计算结果为 true 还是 false,这都会减少您的 xy

类似地,所有 if 语句将保持递减递增x & y。这就是为什么在某个时刻,xy 的值或两者都低于 0,从而给出 index数组中的 -1 。因此,ArrayIndexOutOfBoundsException

您可以通过在 if 语句中使用 x-1y+1 来修复此问题,而不是使用 increment/减量运算符。

这行 SnakeBox.neighbor(SnakeBox.java:150) 表示 neighbor 方法中存在错误,只需查看 if neighbor() 方法中的语句告诉您可能出了什么问题。

关于java - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : -1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15826513/

相关文章:

java - Android(大)在浮点值产品上失败

java - 向可扩展 ListView 添加按钮

ios - 在单独的线程中循环位置数组

java - 修改 .csv 文件数据 JAVA 时遇到问题

Java - 在哪里存储额外的资源文件

java - 基于jSpinner更新jLabel

Javascript - 使用最后一个迭代值的对象值数组

javascript - 通过数组中的后续位置将字段添加到数组内的对象

c - 尝试显示列表时读取访问冲突 (0xCCCCCCD0)

c# - 使用查询字符串解析 AppSettings 值时出错