Java 为什么在创建Swing组件时会出现NullPointerException?
创建长方体对象时出错Java 为什么在创建Swing组件时会出现NullPointerException?,java,swing,nullpointerexception,Java,Swing,Nullpointerexception,创建长方体对象时出错 public void drawBoard(Board board){ for(int row = 0; row < 8; row++){ for(int col = 0; col < 8; col++){ Box box = new Box(board.getSquare(col, row).getColour(), col, row); squarePanel[col][row]
public void drawBoard(Board board){
for(int row = 0; row < 8; row++){
for(int col = 0; col < 8; col++){
Box box = new Box(board.getSquare(col, row).getColour(), col, row);
squarePanel[col][row].add(box);
}
}
板构造函数如下所示:
public Board(){
grid = new Square[COLUMNS][ROWS];
for(int row = 0; row < 8; row++){
for(int col = 0; col < 8; col++){
grid[col][row] = new Square(this);
}
}
for(int row = 0; row < 8; row++){
for(int col = 0; col < 4; col++){
int odd = 2*col + 1;
int even = 2*col;
getSquare(odd, row).setColour(Color.BLACK);
getSquare(even, row).setColour(Color.WHITE);
}
}
}
因此,当在数组中循环时,它使用两个整数作为坐标来创建长方体。
引用坐标,然后运行repaint()。
该框还使用Board类中的两个整数从正方形中获取颜色。
因为颜色已经设置好了,在drawBoard(board)方法运行之前,这应该不是问题,对吗
Exception in thread "main" java.lang.NullPointerException
at View.drawBoard(View.java:38)
at Game.<init>(Game.java:21)
at Game.main(Game.java:14)
这是一个猜测,因为您没有提供完整的源代码-但是对于循环,您似乎已经硬编码了行数和列数,但是对于声明2D网格数组,您使用了两个常量 根据getSquare的实现,如果这些常量与硬编码的值不同,则可能是导致此问题的原因。在drawBoard()方法中,有两个位置可能导致NullPointerException
Box box = new Box(board.getSquare(col, row).getColour(), col, row);
如果board为null,或者getSquare的结果为null,那么您将看到一个NPE
另一个领域,也是人们抛出NullPointerException的一个非常常见的地方是
squarePanel[col][row].add(box);
由于您没有向我们展示如何声明,我将假设以下内容,您已经创建了一个JPanel,在此面板中,您没有为8x8阵列创建新实例。因此,当您添加()新框时,它将抛出NullPointerException
Box box = new Box(board.getSquare(col, row).getColour(), col, row);
如果你能告诉我们你的
视图类中38
是哪一行的话,这会更有帮助。你能为stacktrace提供其中的NullPointerException吗?不确定,这是控制台中的错误吗?@Alex,是的,启动“java.lang.NullPointerException”的东西并且里面有一堆行号-所有这些。请发布Square
的代码,给定堆栈跟踪,board
变量、board.getSquare
或squarePanel
变量的结果为空。您可以添加一些调试语句来打印每个调试语句的值吗?e、 g.System.out.println(板);系统输出打印LN(方形面板);系统输出打印项次(“行”+行+”,列“+列);System.out.println(board.getSquare(col,row))代码>这两个常数都等于8。另外,getSquare获取给定给它的两个索引,并给出数组中该位置的平方。应该仔细检查代码。实际上,我没有在8x8阵列中创建任何新的JPanel实例。现在可以了。
Box box = new Box(board.getSquare(col, row).getColour(), col, row);
squarePanel[col][row].add(box);