2014-12-08 257 views
0

這個問題可以看作是一個整體在here。儘管鏈接的帖子解釋了這個問題,但你不應該把它看作是重複的:它會提出一個不同的問題,併爲這個不同的問題接受一個可接受的答案。計劃任務不會拋出異常

雖然這個問題可以在其他後閱讀,我會在這裏解釋它,以及:

我正在開發一個蛇一樣的遊戲,可以AIS的播放,並用於該目的。所有這些認可機構都應擴展一個名爲SnakeLogic的抽象類。所有這些AI也應該駐留在特定文件夾中的獨立.jar文件中,主程序可以從中找到它們並使用類加載器列出它們。

然後,用戶可以從列表中選擇他/她的AI中的一個,如果所有星星排成一列,並用此AI玩遊戲。

現在,我有我的主要程序的方法,但未通過AI下一步的行動,像這樣:

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語句。正如你所看到的,我打印堆棧跟蹤並結束遊戲,如果在執行moveCmd可運行期間發生異常。如果我不像這樣打印堆棧跟蹤,或者如果我完全刪除了try-catch,那麼在執行該塊期間,在運行時異常的情況下,我從不會收到任何錯誤。爲什麼?是因爲它被封裝在可運行的內部嗎?另請注意,snakeGame.makeMove(player, direction);行不會在主程序中調用任何代碼; snakeGame是駐留在外部.jar中的SnakeLogic的實例。

如果我刪除了try-catch,爲什麼我不會收到任何錯誤?我錯誤的意思是運行時錯誤。

+0

看起來有點像這樣:HTTP:// stackoverflow.com/questions/6546193/how-to-catch-an-exception-from-a-thread – 2014-12-08 08:28:57

+0

如果我刪除了try-catch,爲什麼我不會收到任何錯誤?你是指在運行時還是編譯時間? – sol4me 2014-12-08 08:29:02

+0

@Matt這個問題涉及'線程',我的問題沒有。運行期間的 – 2014-12-08 08:30:53

回答

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

除了我是如何做到這一點外,還有什麼方法可以吸引例外,或者讓它把它像普通的行爲良好的程序一樣扔掉? – 2014-12-08 08:38:10

+0

您可以像您那樣環繞,使用run()方法中的Try-Catch執行所有操作,也可以使用可引發異常的Callable:https://docs.oracle.com/javase/7/docs/api/java/ UTIL /並行/ Callable.html – Blitzkr1eg 2014-12-08 08:43:55