我收到了错误:
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());
}
}
}
答案 0 :(得分:2)
这是因为if
中的neighbor()
个语句。
if (box[x--][y--] == 'S')
- 评估为true or false
,这会减少x
&amp; y
。
同样,您的所有if
语句都会保留decrementing
或incrementing
x & y
。这就是为什么在某一点上,x
或y
或两者的值都低于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--;