我有一个创建Ship的类(Ship扩展GameObject类)并尝试将其添加到gameBoard中。
为此,它告诉gameFrame添加对象,如下所示:
public void startNewGame() {
Ship myShip = new Ship(GAME_BOARD_WIDTH / 2, GAME_BOARD_HEIGHT-1, SHIP_WIDTH,
SHIP_HEIGHT);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gameFrame = new InvadersGameFrame();
}
});
gameFrame.addGameObject(myShip); //Problem line
gameFrame.repaint();
}
然后,gameFrame调用:
GameBoard gameBoard = new GameBoard();
...
...
public void addGameObject(GameObject ob) {
gameBoard.addGameObject(ob);
}
依次调用:
public class GameBoard extends JPanel implements GameData{
private JPanel gameBoard;
private List<GameObject> objects = new ArrayList<>();
public GameBoard() {
gameBoard = new JPanel();
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
setBackground(Color.black);
g.setColor(Color.RED);
for(GameObject ob : objects){
g.drawOval(ob.x, ob.y, ob.width, ob.height);
}
}
//Places object into list for drawing upon next repaint.
public void addGameObject(GameObject ob) {
objects.add(ob);
}
}
现在我的问题是,当我
gameFrame.addGameObject(myShip);
时,我会收到一个空指针异常棘手的事情是,当我通过调试器运行时,我根本没有收到NPE(但是我的对象列表似乎仍然是空的)。
此外,我可以继续进行所有操作,并且仍然看到myShip,所以我引用的GameObject(Ship)是否错误?
我的addGameObject参数应该以某种方式更抽象吗?
最佳答案
问题是您在gameFrame
内部分配了Runnable
,直到稍后才运行。因此gameFrame
在您调用gameFrame.addGameObject(myShip)
时可能为空