吸气剂和塞特斯&完全混乱

时间:2017-01-28 10:59:42

标签: java

我的第二堂课(MazeSolver)遇到问题时,我的第一堂课(MazeInput)没有得到 cols 的值。这导致MazeSolver中的drawMaze()方法中的 ArrayOutOfBoundsExceptions NullPointerExceptions 。我理解为什么会发生这些错误,由于缺乏对如何将字段传递给其他类的理解,我只是无法解决它。你们可爱的人请指出我出错的地方吗?

public class LA2_MazeInput {

private int rows;
private int cols;

public LA2_MazeInput() {
    this.rows = getNumRows();
    this.cols = getNumCols(rows);
}

private int getNumRows() {

    int rows = 0;
    String input;

    input = JOptionPane.showInputDialog(
            "Please enter the number of rows (5-10) for the maze.");


    rows = Integer.parseInt(input);




    return rows;
}

private int getNumCols(int numRows) {

    int cols = 0;
    String input;



    input = JOptionPane.showInputDialog(
            "Please enter the number (5-10) of columns for the maze."
            + "\n(Value cannot be the same as the number of rows.)");


    cols = Integer.parseInt(input);




    return cols;
}

public void initializeMazeSolver(/*MazeSolver solver*/) {

    LA2_MazeSolver ms = new LA2_MazeSolver();
    ms.setNumRows(this.rows);
    ms.setNumCols(this.cols);




  }

}



public class LA2_MazeSolver {
    private int rows;
    private int cols;
    private String[][] maze;

    public LA2_MazeSolver() {

        this.maze = new String[rows][cols];
    }

public void setNumRows(int numRows) {

    this.rows = numRows;

}

public void setNumCols(int numCols) {

    this.cols = numCols;

}

public int getNumRows() {

    return this.rows;

}

public int getNumCols() {

    return this.cols;

}

public void drawMaze() {

    Random r = new Random();

    maze[0][0] = "S";
    maze[rows - 1][cols - 1] = "D";
    int limit = ((rows * cols) / 3);

    for (int i = r.nextInt(limit) + 1; i < limit; i++) {

        maze[r.nextInt(rows - 1)][r.nextInt(cols - 1)] = "#";

    }

    for (int i = 0; i < maze.length; i++) {
        for (int c = 0; c < maze[0].length; c++) {

            if (!(maze[i][c].matches("#")) && !(maze[i][c].matches("S")) && !(maze[i][c].matches("D"))) {

                maze[i][c] = Integer.toString(r.nextInt(100) + 1);

            }

        }
    }
    for (int i = 0; i < maze.length; i++) {
        for (int c = 0; c < maze[0].length; c++) {

            System.out.print(maze[i][c] + " ");

        }
        System.out.println();
    }


  }
}

1 个答案:

答案 0 :(得分:2)

您的[0][0]构造函数初始化您的二维数组,其大小为 LA2_MazeSolver ms = new LA2_MazeSolver(); // constructor of LA2_MazeSolver is called ms.setNumRows(this.rows); // does nothing for the array ms.setNumCols(this.cols); // does nothing for the array 。之后,您尝试设置此时为时已晚的行和列。

  public LA2_MazeSolver(int rows, int cols) {
        this.maze = new String[rows][cols];
        this.rows = rows; // in case you want them to store
        this.cols = cols; // in case you want them to store
    }

为了解决这个问题,您可以将参数与构造函数一起传递。

public LA2_MazeSolver() {
    }

public void setNumRows(int numRows) {
    this.rows = numRows;
}

public void setNumCols(int numCols) {
    this.cols = numCols;
}

public void init(){
    this.maze = new String[rows][cols];
}

反模式:

 LA2_MazeSolver ms = new LA2_MazeSolver();
 ms.setNumRows(this.rows);
 ms.setNumCols(this.cols);
 ms.init();

会像这样初始化

IEnumerable<T>