为什么在创建Swing组件时收到NullPointerException?

问题描述:

创建Box对象时发生错误。为什么在创建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].add(box); 
     } 
    } 

局从游戏构造这里(其他类)给出:

public Game() throws Throwable{ 
    View graphics = new View(); 
    board = new Board(); 
    board.setDefault(); 
    graphics.drawBoard(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); 
    } 
} 

因此, e遍历数组,它使用两个整数作为坐标来创建Box。 引用坐标,然后运行repaint()。 这个盒子也从Board类中的Square中获得使用这两个整数的颜色。 由于颜色已经设置好,所以在drawBoard(板)方法运行之前,这应该不成问题,对吧?

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

你能提供的堆栈跟踪与NullPointerException异常的它? – 2011-01-12 13:40:12

+0

不知道,是在控制台中的错误? – 2011-01-12 13:44:22

+0

@Alex,是的,启动“java.lang.NullPointerException”并且有一堆行号的东西 - 所有这些。 – justkt 2011-01-12 13:46:18

在你drawBoard()方法中,有2个地方可能会导致空指针异常

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

,如果董事会是空,或getSquare的结果为空,那么你将看到一个NPE。

其他区域,一个很普通的地方的人抛出NullPointerException异常是

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

因为你还没有告诉我们如何声明这一点,我将承担以下,你必须创建一个JPanel,在此面板中你尚未为8x8阵列创建新的实例。所以,当你添加()的新盒子,它会抛出NullPointerException异常

这将帮助更多的,如果你还可以告诉我们38是什么线在你View

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

取决于您的getSquare的实现,如果这些常量与硬编码值不同,那可能是导致问题的原因。