0

こんにちは私はプログラミングクラスのプログラムを書いています、そして私は以下を取得しています:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 18
    at Life.countNeighbors(Life.java:200)
    at Life.genNextGrid(Life.java:160)

以前にエラーが発生しましArrayIndexOutOfBoundsExceptionた。通常、配列のインデックスを追加または減算しようとしたときに発生します。ただし、今回はまったく異なり、エラーが発生している理由を誰かが指摘してくれることを期待していました。

私のプログラムに関する情報:このプログラムは、ジョン・コンウェイのライフゲームのようなものです。2次元配列を使用し、特定の要素を(true =生きている)または(false =死んでいる)に設定すると、プログラムは、セルが持つネイバーの数に基づいて、セルが次世代で生きるか死ぬかを判断します。(3人の隣人=新しい細胞の誕生)(2,3人の隣人=彼らは生き続ける)彼らが次世代で死んだ他のもの。

私の編集者によると、IndexOutOfBoundエラーは次の行が原因で発生します。

if(!(grid[1][1]) && !(grid[1][18]) && !(grid[18][1]) && !(grid[18][18]))

上記の行を制約として作成しましたが、元の配列の境界を超えてインデックスを検索するようにJavaに指示するべきではありません。これは、最終的にはブール(true / false)ステートメントにすぎないためです。誰かが私がこのエラーをデバッグするのを手伝ってくれるなら、それは素晴らしいでしょう。

ここに私のコードがあります:(メインメソッドは含まれていません)

 public static void clearGrid ( boolean[][] grid )
{
    int col;
    int row = 1;

    while(row < 18){
       for(col = 1; col < 18; col++){
          grid[row][col]= false;//set each row to false
       }
         row++;
    }//set all elements in array to false
}

public static void genNextGrid ( boolean[][] grid )
{
    //new tempprary grid
     boolean[][] TempGrid = new boolean[GRIDSIZE][GRIDSIZE];

     TempGrid= grid; // copy the current grid to a temporary grid

     int row = 1;
     int col = 1;

    countNeighbors(TempGrid, row, col); // passes the TempGrid to countNieghbor method

 for(row = 1; row < 18; row++){

        countNeighbors(TempGrid, row, col);

        for(col = 1; col < 18; col++){

            countNeighbors(TempGrid, row, col);

            if(countNeighbors(grid, row, col) == 3)
            {
                TempGrid[row][col] = true;
            }
            else if(countNeighbors(grid, row, col) == 2 || countNeighbors(grid, row, col) == 3)
    {
                TempGrid[row][col] = true;
            }
            else
            {
                TempGrid[row][col] = false;
            }

        }
    }
}

public static int countNeighbors ( final boolean[][] grid, final int row, final int col )
{
    int n = 0; //int used to store the # of neighbors
    int temprow = row;
    int tempcol = col;
//count # of neighbors for the cell on the edge but not the corner
            for(temprow = row; temprow <= 18; temprow++)
            {
                for(tempcol = row; tempcol <= 18; tempcol++)
                {
                     if(temprow == 1 || temprow == 18 || tempcol == 1 || tempcol ==18)
                     {
                         if(!(grid[1][1]) && !(grid[1][18]) && !(grid[18][1]) && !(grid[18][18]))
                         {
                             if(grid[temprow][tempcol] == true)
                             {
                                 n++;
                             }
                         }
                     }
                }
            }


//count # of neighbors for the corner cells
     for(temprow = row; temprow <= 18; temprow++)
     {
         for(tempcol = row; tempcol <= 18; tempcol++)
         {
            if(grid[1][1] || grid[1][18] || grid[18][1] || grid[18][18])
                    {
                        if(grid[temprow][tempcol] == true)
            {
                n++;
            }
                    }
         }
     }

// count the cells that are not on the edge or corner
    while(temprow >= 2 && tempcol >= 2 && temprow <= 17 && tempcol <= 17)
    {
    for(temprow = row; temprow-1 <= temprow+1; temprow++)
    {
            for(tempcol = col; tempcol-1 <= tempcol+1; tempcol++)
            {
                if(grid[temprow][tempcol] == true)
                {
                    n++;
                }
            }
    }
    }
    return n; // return the number of neighbors
}
4

2 に答える 2

7

完全なスタックトレースと問題がどこにあるかについての表示がなければ、これは私の最善の推測です:

grid[18][1]

18は、アクセスできる配列のサイズを超えています。Java配列では、ゼロベース(0)です。私はあなたの投稿全体を見てきましたので17、これが最も論理的な理由のようです。

于 2012-12-11T19:44:02.750 に答える
5

Javaでは、配列インデックスにはからまでの番号が付けられ0ますn-11コードを見ると、からまでの番号が付けられていると想定しているように見えますn

于 2012-12-11T19:44:15.743 に答える