我有一个创建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)时可能为空

10-05 23:26