2017-01-28 8 views
1

私は私の第二のクラス(MazeSolver)とのトラブルを抱えているが私の最初のクラス(MazeInput)からcolsのの値を取得されていません。これはMazeSolverのdrawMaze()メソッドでArrayOutOfBoundsExceptionsNullPointerExceptionsにつながります。私はこれらのエラーがなぜ起こっているのか理解しています。フィールドを他のクラスに渡す方法の理解が不足しているため、対処方法がわかりません。あなたは素敵な人たちが私が間違っているところを指摘してくれますか?ゲッター&セッター&全く混乱

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


    } 
} 

答えて

2

あなたMazeSolverコンストラクタは[0][0]の大きさとあなたの2次元配列を初期化します。その後、あなたはこの時点で遅すぎる行と列を設定しようとします。

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(); 
+0

のようにそれを初期化だろう、私はそのことについて考えたが、その時点で私もゲッターとセッターが必要でしょうか? –

+0

@GregSmith限り、私はあなたがそれらを必要としないと言うことができます。 –

+0

それは問題の半分です...私はコンストラクタでそれをしたいです。しかし、私はゲッターとセッターを持って、彼の "基本的なプログラムデザイン"に従う必要が私のプロとしてそれらを利用する必要があります。 getterやsetterでこれを行う方法はありますか? –

関連する問題