为什么在创建Swing组件时会出现NullPointerException?

时间:2011-01-12 13:38:01

标签: java swing nullpointerexception

创建Box对象时发生错误。

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

Board来自Game构造函数(另一个类):

public Game() throws Throwable{
    View graphics = new View();
    board = new Board();
    board.setDefault();
    graphics.drawBoard(board);
}

Board构造函数如下所示:

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

最后是Box类:

class Box extends JComponent{
Color boxColour;
int col, row;
public Box(Color boxColour, int col, int row){
    this.boxColour = boxColour;
    this.col = col;
    this.row = row;
    repaint();
}
public void paint(Graphics drawBox){
    drawBox.setColor(boxColour);
    drawBox.drawRect(50*col, 50*row, 50, 50);
    drawBox.fillRect(50*col, 50*row, 50, 50);
    }
}

因此,在循环遍历数组时,它使用两个整数作为坐标来创建Box。 引用坐标,然后运行repaint()。 该框也使用Board类中的Square中的两个整数来获取颜色。 由于颜色已设置,在运行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)

Square

的相关部分
import java.awt.Color;

public class Square {

    private Piece piece;
    private Board board;
    private Color squareColour;

public Square(Board board){
    this.board = board;
}

public void setColour(Color squareColour){
    this.squareColour = squareColour;
}

public Color getColour(){
    return squareColour;
}

2 个答案:

答案 0 :(得分:1)

在你的drawBoard()方法中,有两个地方可能导致NullPointerException

Box box = new Box(board.getSquare(col, row).getColour(), col, row);

如果board为null,或者getSquare的结果为null,那么你将看到一个NPE。

另一个区域,以及人们抛出NullPointerExceptions的一个非常常见的地方是

squarePanel[col][row].add(box);

由于您没有向我们展示您如何声明这一点,我将假设以下内容,您已经创建了一个JPanel,在此面板中您尚未为8x8阵列创建新实例。因此,当您添加()新框时,它将抛出NullPointerException

如果您还可以告诉我们38班级中的View

,那会更有帮助。

答案 1 :(得分:0)

猜测是因为你还没有提供完整的源代码 - 但对于你似乎在行数和列数中硬编码的循环,但是为了声明2D网格数组,你使用了两个常量。

根据您对getSquare的实现情况以及这些常量是否与您的硬编码值不同,可能会导致问题。