[英]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.