确定。所以我像这样声明一个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
很明显,它有效......
然后在一个开关中,我试图访问它以查看它是“墙”还是“空格”并且我得到一个空指针异常...有没有人看到这里的缺陷我错过了?< / p>
if(y > 0 && !panels[x][y-1].getName().matches("wall")){
y--;
}
答案 0 :(得分: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 < 10
和0 <= y < 8
。
答案 1 :(得分: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]);
}
这有用吗?
答案 2 :(得分:0)
您正在使用
获取NPEif(y > 0 && !panels[x][y-1].getName().matches("wall")){
y--;
}
意味着你需要做一些空检查
if(y > 0 && panels[x][y-1] != null && !panels[x][y-1].getName().matches("wall")){