0

Этот вопрос можно рассматривать как целое в here. Хотя связанная статья объясняет эту проблему, вы не должны думать об этом как о дубликате: она задает другой вопрос и принимает принятый ответ на этот другой вопрос.Запланированное задание никогда не выдает исключений

Хотя вопрос можно прочитать в другой статье я объясню это здесь, а также:

Я разрабатывает змеиный игру, в которую можно играть с AIs, и предназначен для этой цели , Все такие ИИ должны расширять абстрактный класс под названием SnakeLogic. Все такие ИИ также должны находиться в своих автономных архивах .jar в определенной папке, откуда основная программа может их найти и перечислить с помощью загрузчиков классов.

Пользователь может выбрать один из своих ИИ из списка, если все звезды упадут в линию и сыграют в игру с этим ИИ.

Теперь у меня есть метод в моей основной программе, которая получает следующий шаг от ИИ, как так:

public void startGame(int speed) {   
    gameInterface.showWindow(); 
    Runnable moveCmd =() -> { 
     try { 

      for (Player player : snakeGame.getPlayers()) { 
       if (player.isDead()) { 
        continue; 
       } 

       String move = player.getLogicHandler().getMove(); 

       Direction direction = Direction.directionFromString(move); 
       snakeGame.makeMove(player, direction); 
      } 

      gameInterface.getFrame().repaint(); 
      snakeGame.wait(speed); 

      if (snakeGame.gameOver()) { 
       stopGame(); 
      } 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
      stopGame(); 
     } 
    }; 

    /* moveSchedule is an instance of ScheduledExecutorService */ 
    moveSchedule.scheduleAtFixedRate(moveCmd, 1000, speed, TimeUnit.MILLISECONDS);   
} 

Я не собираюсь слишком активное участие в коде выше. Однако я хотел бы обратить ваше внимание на утверждение try-catch. Как вы можете видеть, я печатаю stacktrace и заканчиваю игру, если исключение происходит где-то во время выполнения moveCmd runnable. Если я не распечатаю stacktrace, как это, или если я полностью удаляю try-catch, я никогда не получаю никаких ошибок в случае исключения во время выполнения этого блока. Зачем? Это потому, что оно завернуто внутри runnable? Также обратите внимание, что строка snakeGame.makeMove(player, direction); не вызывает никакого кода в основной программе; snakeGame - это экземпляр SnakeLogic, который находится во внешнем .jar.

Почему я не могу получить какие-либо ошибки, если удалю попытку? По ошибкам я подразумеваю ошибки времени выполнения.

+0

Выглядит немного как это: HTTP: // stackoverflow.com/questions/6546193/how-to-catch-an-exception-from-a-thread –

+0

Почему бы мне не получить какие-либо ошибки, если я удалю try-catch? вы имеете в виду во время выполнения или времени компиляции? – sol4me

+0

@Matt Этот вопрос включает 'Thread', мой вопрос не делает. –

ответ

0

Из-за этого кода в FutureTask:

try { 
      runner = Thread.currentThread(); 
      if (getState() == RUNNING) 
       callable.call(); // don't set result 
      runner = null; 
      return compareAndSetState(RUNNING, 0); 
     } catch (Throwable ex) { 
      innerSetException(ex); 
      return false; 
     } 

Так что ловить исключение и настройка его для возврата только на выполнение Callable.get()

+0

Есть ли способ получить исключение или сказать ему бросить его, как обычную программу хорошего поведения, помимо того, как я это сделал? –

+0

Вы можете либо окружить, как и вы, все с помощью Try-Catch в методе run() или использовать Callable, который может генерировать исключения: https://docs.oracle.com/javase/7/docs/api/java/ Util/параллельный/Callable.html – Blitzkr1eg

Смежные вопросы