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

时间:2013-04-05 05:23:32

标签: 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;
  }

   }

此外,驱动程序(第6页)是:

 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());
     }                      
  }
}

2 个答案:

答案 0 :(得分:2)

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

if (box[x--][y--] == 'S') - 评估为true or false,这会减少x&amp; y

同样,您的所有if语句都会保留decrementingincrementing x & y。这就是为什么在某一点上,xy或两者的值都低于0,在数组中给出index -1。因此ArrayIndexOutOfBoundsException

您可以使用x-1&amp; y+1语句中的if代替increment/decrement运算符。

此行SnakeBox.neighbor(SnakeBox.java:150)表示neighbor方法中存在错误,只是通过查看if方法中的neighbor()语句,告诉您哪些内容可能出错

答案 1 :(得分:1)

box[x--][y--]

在尝试访问框之前,您没有检查框的边界条件。此外,使用x--在每个阶段更改x的值。绝对使用它们 - x-1等。

您的其他变量遇到同样的问题case 2: endRow--;