Решатель 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).

Другие вопросы по тегам