Решатель java-головоломки ArrayIndexOutOfBoundsException
****************** Я нашел проблему. Я поменял индекс изменений... таким образом, я шел вниз по строке, а не по столбцу. Спасибо вам всем ***************************
В настоящее время я работаю над Java решателем головоломок. Вся программа работает, кроме самой решающей части... Я знаю сложную часть. Я сделал это рекурсивно. Я знаю, почему массив будет выбрасывать это исключение. PathChoices.java должен препятствовать тому, чтобы это когда-либо бросало это... это кроме последнего ряда. Последний ряд не проблема. Прогрессия идет от 1,1 до Вот вход:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Maze.board(Maze.java:34)
at MazeSolver.mazeSolver(MazeSolver.java:38)
at MazeSolver.mazeSolver(MazeSolver.java:65)
at MazeSolver.mazeSolver(MazeSolver.java:65)
at MazeSolver.mazeSolver(MazeSolver.java:43)
at MazeSolver.mazeSolver(MazeSolver.java:43)
at MazeSolver.mazeSolver(MazeSolver.java:32)
at MazeSolver.mazeSolver(MazeSolver.java:43)
at Maze.main(Maze.java:66)
String input = " ___________________ \n"
+ "|_ | ___ _ _|\n"
+ "| | | _|___| |_ | |\n"
+ "| _____|_ | _| |\n"
+ "| | | _ | _|_ | |\n"
+ "|___| | | | _ | | |\n"
+ "| |_ | _____| | |_|\n"
+ "| |___| | _| |_ |\n"
+ "| | |___ |_ | |\n"
+ "|_| | | _ |_| |_| |\n"
+ "|___|___|_______|___|\n"
Где я пытаюсь решить это сверху вниз слева направо. Вот мои занятия:
import java.awt.Point;
import java.util.Stack;
public class Maze {
private char [][] myBoard;
private Point myLocation;
private Point boardSize;
private Stack<String> sol;
private MazeParser mp;
public Maze(String m){
mp = new MazeParser(m);
myBoard = mp.parseMaze();
myLocation = new Point(1,1);
boardSize = mp.sizeOfBoard();
sol = new Stack<String>();
}
public void appendSol(String s){
sol.push(s);
}
public String printSol(){
String solution = "";
while(!sol.isEmpty()) {
solution += sol.pop();
}
return solution;
}
public char board(int x, int y) {
line 34 return myBoard[x][y];
}
public char [][] getBoard() {
return myBoard;
}
public Point size(){
return boardSize;
}
public Point getLoc(){
return myLocation;
}
public void setLoc(Point p){
myLocation = p;
}
public static void main(String[] args) {
Maze testMaze = new Maze(" ___________________ \n"
+ "|_ | ___ _ _|\n"
+ "| | | _|___| |_ | |\n"
+ "| _____|_ | _| |\n"
+ "| | | _ | _|_ | |\n"
+ "|___| | | | _ | | |\n"
+ "| |_ | _____| | |_|\n"
+ "| |___| | _| |_ |\n"
+ "| | |___ |_ | |\n"
+ "|_| | | _ |_| |_| |\n"
+ "|___|___|_______|___|\n");
MazeSolver.mazeSolver(testMaze,new Point(1,1),3);
System.out.println(testMaze.printSol());
}
}
Вот как я выбрал, куда я могу пойти. PathChoices:
public class PathChoices {
public static boolean isSouth(int x, int y, Maze myMaze){
if (myMaze.board(x+1, y) == '|'){
return false;
} else {
return (myMaze.board(x,y) != '_' && !(myMaze.board(x+1,y) == '|')) &&
(myMaze.board(x+1,y) == '_' ||
myMaze.board(x+1,y) == ' ');
}
}
public static boolean isNorth(int x, int y, Maze myMaze){
if (myMaze.board(x-1, y) == '|'){
return false;
} else {
return myMaze.board(x-1,y) == ' ';
}
}
public static boolean isEast(int x, int y, Maze myMaze){
if (myMaze.board(x, y+1) == '|'){
return false;
} else {
return myMaze.board(x,y+1) == '_' ||
myMaze.board(x,y+1) == ' ' ;
}
}
public static boolean isWest(int x, int y, Maze myMaze){
if (myMaze.board(x, y-1) == '|'){
return false;
} else {
return myMaze.board(x,y-1) == '_' ||
myMaze.board(x,y-1) == ' ' ;
}
}
}
Это мой парсер:
import java.awt.Point;
public class MazeParser {
private int xLin;
private int yLin;
private char [][] mappedMaze;
private String [] myMazeArray;
public MazeParser(String m){
String maze = m;
myMazeArray = maze.split("\n");
xLin = myMazeArray[0].toCharArray().length;
yLin = myMazeArray.length;
mappedMaze = new char[yLin][xLin];
}
public Point sizeOfBoard(){
return new Point(yLin,xLin);
}
public char [][] parseMaze() {
for(int i = 0;i < yLin; i++) {
for (int j = 0; j < xLin; j++){
mappedMaze[i][j] = myMazeArray[i].toCharArray()[j];
}
}
return mappedMaze;
}
}
И последнее, но не менее... Это метод Солвера (тот, с которым у меня проблемы):
import java.awt.Point;
public class MazeSolver {
/**
* Given the maze, the x and y coordinates (which must be odd),
* and the direction we came from, return true if the maze is
* solvable, and draw the solution if so.
*/
public static boolean mazeSolver (Maze m, Point p, int dirFrom ) {
int x = p.x;
int y = p.y;
Maze maze = m;
boolean ok = false;
for (int i = 0 ; i < 4 && !ok ; i++) {
if (i != dirFrom) {
switch (i) {
// 0 = North, 1 = East, 2 = South, 3 = West
case 2:
if (PathChoices.isSouth(x,y,maze)) {
System.out.println( maze.board(x, y) + "\t::"+ maze.board(x+1, y) +"::W: "
+ ""+maze.board(x, y-1) + "N: "
+ ""+ maze.board(x-1, y) + "E: "
+ ""+ maze.board(x, y+1) + ":*S: "
+maze.board(x+1, y) + ": " + x + " " + y + ": i " + i + " :" + dirFrom);
ok = mazeSolver (maze, new Point(x, y + 1), 0);
}
break;
case 1:
if (PathChoices.isEast(x,y,maze)){
System.out.println(maze.board(x, y) + "\t::::W: "
+ ""+maze.board(x, y-1) + "N: "
+ ""+ maze.board(x-1, y) + "*E: "
+ ""+ maze.board(x, y+1) + "S: "
+maze.board(x+1, y) + " " + x + " " + y + ": i " + i + " :" + dirFrom);
ok = mazeSolver (maze, new Point(x + 1, y), 3);
}
break;
case 3:
if (PathChoices.isWest(x,y,maze)){
System.out.println(maze.board(x, y) + "\t::::*W: "
+ ""+maze.board(x, y-1) + "N: "
+ ""+ maze.board(x-1, y) + "E: "
+ ""+ maze.board(x, y+1) + "S: "
+maze.board(x+1, y) + " " + x + " " + y + ": i " + i + " :" + dirFrom);
ok = mazeSolver (maze, new Point(x - 1, y), 1);
}
break;
case 0:
if (PathChoices.isNorth(x,y,maze)){
System.out.println(maze.board(x, y) + "\t::::W: "
+ ""+maze.board(x, y-1) + "*N: "
+ ""+ maze.board(x-1, y) + "E: "
+ ""+ maze.board(x, y+1) + "S: "
+maze.board(x+1, y) + " " + x + " " + y+ ": i " + i + " :" + dirFrom);
ok = mazeSolver (maze, new Point(x, y - 1), 2);
}
break;
default:
break;
}
}
}
// check for end condition
if (x == maze.size().x-1 && y == maze.size().y-2)
ok = true;
// once we have found a solution, draw it as we unwind the recursion
if (ok) {
switch (dirFrom) {
case 0:
maze.appendSol("N");
break;
case 1:
maze.appendSol("E");
break;
case 2:
maze.appendSol("S");
break;
case 3:
maze.appendSol("W");
break;
}
}
return ok;
}
}
Это вызывает исключение, и проблема в том, что это не должно происходить в PathChoice.java. Любая помощь приветствуется.
3 ответа
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Maze.board(Maze.java:34)
К счастью, есть только одна строка, поэтому нам не нужно видеть номера строк.
public char board(int x, int y) {
return myBoard[x][y];
}
Почти наверняка вы вызвали этот метод с -1 в качестве одного из параметров. Не имеет смысла запрашивать -1-й или n-й элемент массива размера n. Можно использовать только индексы от 0 до n-1. Кроме того, я не буду рассказывать вам, что такое ArrayIndexOutOFBoundsException - это слишком легко найти.
Кроме того, трассировка стека (другие номера строк) сообщает вам, откуда это было вызвано.
at MazeSolver.mazeSolver(MazeSolver.java:38)
...
Для случая 0 вы вызываете метод правления с x-1
maze.board(x-1, y)
Таким образом, метод платы будет вызван для
return myBoard[-1][y];
Массив начинается с нулевого индекса. Следовательно ArrayIndexOutOfBound
Похоже, вы не обрабатываете крайние случаи, когда вызываете maze.board() в своем классе MazeSolver.
Прежде чем пытаться идти в определенном направлении, убедитесь, что местоположение действительно существует. Например, перед вызовом maze.board(x, y-1) вы должны убедиться, что у вас еще нет минимального значения для y ( -> 0).