2016-12-15 10 views
1

Этот Java-метод пропускает инструкцию return. Мне было интересно, кто-нибудь столкнулся с этим и узнал о решении. Какая бы ошибка ни была очень тонкой.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

Кроме того, эта ошибка только начал происходит, когда я кладу gamestates в структуре стека. Вот код, я сейчас, используя для перехода GameState:

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

Если ваше «доказательство» заключается в том, что он регистрирует «контрольную точку 2» после «контрольной точки 1», это, очевидно, еще один вызов. Попробуйте отладить код. – 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 гс = gsm.peek() getNextGameState(). \t \t \t gsm.pop(); \t \t \t \t \t \t если (гс = нуль!) \t \t \t \t gsm.push (гс); \t \t} ' – DayTripperID

1

Вы можете разместить больше кода? Вы, вероятно, называете это дважды, и он не пропускает возвращение. Если вы действительно думаете, что он поставил точку останова, чтобы помочь вам отлаживать и наблюдать за запуском кода.