2017-01-28 12 views
1

私は2次元配列として迷路を作成するプログラムを作成しています。私はちょっとした問題にぶつかって、ArrayIndexOutOfBoundsExceptionです。 drawMazeメソッドのmaze[0][0] = "S"を指しています。私はこれで私の頭を傷つけている、私はなぜそれがエラーを投げているのか分からない。不明な理由によるArrayIndexOutOfBoundsException

import java.util.Random; 

public class LA2_MazeSolver { 

private int rows; 
private int cols; 
private String[][] maze = new String[rows][cols]; 

LA2_MazeInput mi = new LA2_MazeInput(); 

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

      } 

     } 
    } 

} 

public void printMaze() { 

} 

/*public boolean isSolvable() { 

    return solveMazeRecursively(this.rows, this.cols); 

} 

private boolean solveMazeRecursively(int row, int col) { 

}*/ 

public void printResult() { 

} 
} 
+2

'より大きい値にrowsとcolsを初期化し、この問題を解決するには0

ですまだ設定されていない。 'maze'は' rows'と 'cols'が設定された時にのみ初期化する必要があります。 – 4castle

+0

値を割り当てる前に、プログラムの上部またはコンストラクタで迷路を初期化する必要があります。行と列を特定のintに変更します。 – Waffles

答えて

0

Javaでは、コンストラクタの外側にprivate String[][] maze = new String[rows][cols];のような定義を行うことはできません。コードのその時点で、rowcolの値は定義されていないので、private String[][] maze = new String[rows][cols];のようなものは明確な振る舞いをしません(rowcolは実際には0であるかもしれません)。あなたがLA2_MazerSolverオブジェクトを作成するときに

private int row; 
    private int col; 
    private String[][] maze; 

    public LA2_MazeSolver(int row, int col) { 
     this.row = row; 
     this.col = col; 
     maze = new String[row][col] 
    } 

さて、あなたは動的に(たとえばsolver = new LA2_MazeSolver(row, col)のために)使用する正しいサイズの配列を作成します。

はこのようなものではなく、試してみてください。

+0

これは本当に役に立ちますが、私はrowとcolの値が別のクラスLA2_MazeInputによって渡されているという事実に固執しています。私はそれらの値をハードコードすることはできません。これを回避する方法はありますか? –

+0

他のクラスでget関数を作成しますか?行= LA2_MazeInput.getRow(); – Waffles

+0

@GregSmithコンストラクタの使い方は分かりませんか?私はその反応をすばやく一緒にしましたが、私はもっと徹底していたはずです。コンストラクターメソッドを使用してオブジェクトを作成するときに、そのオブジェクトに引数を渡すことができます。私の投稿を編集します。 –

2

これは簡単です。配列の境界を超えているため、バインドされていないArray Indexを取得しています。

私はうまくいきました。これはArrayIndexOutOfBoundsExceptionです。それは "maze [0] [0] =" S ";"

あなたは「行」と「迷路」の「COLS」のサイズを指定する以下のブロック

private int rows; 
private int cols; 
private String[][] maze = new String[rows][cols]; 

ノートで迷路を宣言しました。しかし、これらの値はそれぞれ0と0です。初期化時に行と列に値を与えていないことを確認してください。だから、クラスのメンバとして宣言int型のプリミティブのデフォルト値は0 `rows`は` 0である間maze`が初期化されている

関連する問題