簡體   English   中英

java Null Pointer Exception傳遞對象

[英]java Null Pointer Exception passing object

我有一個創建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);時,我收到一個空指針異常gameFrame.addGameObject(myShip);
棘手的事情是,當我通過調試器運行時,我根本沒有收到NPE(但是我的對象列表似乎仍然是空的)。
另外,我可以關注其中的每一個並仍然看到myShip,所以我引用的GameObject(Ship)是否錯誤?
我的addGameObject參數應該以某種方式更抽象嗎?

問題是您要在Runnable內部分配gameFrame ,直到稍后才運行。 因此,在您調用gameFrame.addGameObject(myShip) gameFrame可能為null

問題可能出在您使用的invokeLater上,它是在Swing感到滿意時安排的,並且可能 gameFrame.addGameObject(myShip) 之后發生;

在調試器中不會發生這種情況,因為它有些競爭,在調試器中,Swing在gameFrame.addGameObject(myShip)之前調用運行方法,因為您不能足夠快地單擊以預表達該語句;)

解決此問題的最佳方法是將這些語句移動到run方法中,如下所示:

public void startNewGame() {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            Ship myShip = new Ship(GAME_BOARD_WIDTH / 2, GAME_BOARD_HEIGHT-1, 
                SHIP_WIDTH, SHIP_HEIGHT);
            gameFrame = new InvadersGameFrame();
            gameFrame.addGameObject(myShip); //Problem line
            gameFrame.repaint();
        }
    });
}

這樣做,這4條語句將按預期順序運行,並且在需要時該屬性不會為null

檢查初始化該變量的范圍。 即在新的InvadersGameFrame()周圍的花括號{}。 確保創建對象后使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM