0

Ok。したがって、2D配列を次のように宣言します。

private JPanel[][] panels = new JPanel[10][8];

それから私はそれを次のように記入します:

GridBagConstraints c = new GridBagConstraints();
for(int i = 0; i < 8; i++){
        for(int j = 0; j < 10; j++){
            JPanel temp = new JPanel();
            if(rand.nextInt(10)+1 > 8 && (j != 0 && i != 0)){
                temp.setBackground(Color.BLACK);
                temp.setName("wall");                   
            }else{
                temp.setBackground(Color.WHITE);
                temp.setName("space");
            }
            c.gridx = j;
            c.gridy = i;
            boardCotent.add(temp,c);
            panels[j][i] = temp;
        }
    }
}

それでは、正しく入力されていることを確認するために出力しますか?

for(int i = 0; i < 8; i++){
    for(int j = 0; j < 10; j++){
        System.out.println(j + ":" + i + " -> " + panels[j][i].getName());
    }
}

上記のforループからの出力のサンプルを次に示します。

2:2 -> wall
3:2 -> null
4:2 -> null
5:2 -> wall

明らかに、それは機能しました...

次に、スイッチで、それが「壁」か「スペース」かを確認するためにアクセスしようとしていますが、nullポインター例外が発生します...ここに欠陥がありますか?

if(y > 0 && !panels[x][y-1].getName().matches("wall")){
    y--;
}
4

3 に答える 3

1
2:2 -> wall
3:2 -> null
4:2 -> null
5:2 -> wall

まず、この部分に問題があります。値の代わりに、nullが必要spaceです。

if(y > 0 && !panels[x][y-1].getName().matches("wall"))
{
    y--;
}

次に、このコード0 <= x < 100 <= y < 8いつ実行するかを確認します。

于 2012-10-03T16:02:23.023 に答える
0

両方の配列次元のインデックスを混在させていませんか?
以下を試して確認してください。

int maxY = 10, maxX = 8;
private JPanel [][] panels = new JPanel[maxY][maxX];

for(int y = 0; y < maxY; y++)
  for(int x = 0; x < maxX; x++)
  {
     panels[y][x] = new JPanel();
     System.out.println("array[y=" + y + "][x=" + x + "] = " + panels[y][x]);
  }

それは動作しますか?

于 2012-10-03T16:02:48.177 に答える
0

あなたはNPEを取得しています

if(y > 0 && !panels[x][y-1].getName().matches("wall")){ 
    y--; 
} 

nullチェックを行う必要があることを意味します

if(y > 0 && panels[x][y-1] != null && !panels[x][y-1].getName().matches("wall")){ 
于 2012-10-03T16:03:58.403 に答える