2016-12-15 29 views
1

此java方法正在跳過返回語句。我想知道是否有人遇到過這個問題並知道解決方案。無論這個bug是非常微妙的。Java方法正在跳過返回語句

public GameState getNextGameState() { 
    if (player.getLives() > 0) { 
     if (!player.isAlive()) { 
      System.out.println("checkpoint 1"); 
      player.setIsAlive(true); 
      return new PlayField(width, height, hiScores, player.setCoordinates(width/2, height - 8), 
        stagePattern, stage); 
     } 
     System.out.println("checkpoint 2"); 
     if(++stage > 29) 
      stage = 0; 

     return new PlayField(width, height, hiScores, player.setCoordinates(width/2, height - 8), stage); 
    } 
    return new GameOver(Game.key, hiScores, player.getRank()); 
} 

這裏是控制檯輸出的截圖來證明這一點: enter image description here

而且,這個bug纔開始,當我把我的gamestates在疊層結構發生。這是我現在正在使用的遊戲狀態過渡的代碼:

public void update() { 

    gsm.peek().update(); 

    if(gsm.peek().finished) 
     if(gsm.peek().getNextGameState() == null) 
      gsm.pop(); 
     else 
      gsm.push(gsm.pop().getNextGameState());    
} 

GSM聲明:

public static Stack<GameState> gsm = new Stack<GameState>(); 

希望有人有一些見解。謝謝!

+2

如果您的「證明」是在「檢查點1」之後記錄「檢查點2」,那顯然是另一個調用。嘗試調試您的代碼。 – shmosel

+2

你正在調用'getNextGameState'兩次...... – assylias

+0

另外,PlayField和GameOver都擴展了GameState – DayTripperID

回答

1

這不是同一個電話的結果。
您在這裏調用兩次該方法。
第一次沒有活着,第二次還活着。所以你在輸出中有兩個消息。
在遊戲中,更新階段被連續調用。
只需添加一個System.out.println在方法的開始(即條件前),你可以有確認:

public GameState getNextGameState() { 

    System.out.println("enter method"); 
    ... 
} 
+0

謝謝。新的堆棧調用是'gsm.peek()。update(); \t \t GameState gs = null; \t \t \t 如果\t(gsm.peek()成品。){ \t \t \t GS = gsm.peek()getNextGameState(); \t \t \t gsm.pop(); \t \t \t \t \t \t如果(GS!= NULL) \t \t \t \t gsm.push(GS); \t \t}' – DayTripperID

1

你可以發佈更多的代碼?你可能會調用它兩次,並且不會在回報中跳過。如果你真的認爲這是一個突破點來幫助你進行調試並觀察代碼運行。