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