2015-10-14 80 views
1

在編碼過程中,我想從Runnables中捕獲一些異常。Catch RuntimeException

我試圖趕上與異常的代碼:

public void fooBar(){ 
    //nullable value 
    final String foo = null; 
    try{ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       if(foo == null){ 
        //Only Exception that can be thrown from a Runnable 
        throw new RuntimeException("F.U.B.A.R."); 
       } 
      } 
     }).start(); 
    }catch(Exception ex){ 
     //In my opinion the way to catch this Exception 
     System.out.println(ex.getMessage()); 
    } 
} 

我希望看到作爲輸出是:
F.U.B.A.R.

輸出我得到:在線程 「線程0」 了java.lang.RuntimeException
例外:F.U.B.A.R.

我需要這個的原因是把這個異常放入我自己的,所以我可以正確地使用它。

有誰知道如何獲得預期的輸出而不是我目前的?

+0

對此的需求超出了我,細心闡述*爲什麼*你想要這個嗎?順便說一句,你可以簡單地子類RuntimeException,然後重寫'getMessage()') – meskobalazs

+0

這是一個示例代碼。真正的代碼在JSP項目中。我的目標是不要創建任何可以殺死程序的例外。應該捕獲所有異常/錯誤,並最終在JSP頁面上向用戶顯示。 – creulcat

+2

這不是處理線程間異常的正確方法。在你的情況下,而不是擴展Runnable,你應該使用java.util.concurrent.Callable。 – anfy2002us

回答

3

因爲構建Runnable並在try和catch之間執行.start() - 沒有拋出異常。之後引發運行時異常,當線程執行「run」方法時。

+0

即使我調用#run()我仍然得到System.out和「線程中的異常...」消息 – creulcat

+1

您可以使用try/catch內部的「run」方法 – Rustam

2

當前的catch塊捕獲主線程上的異常,而在另一個線程上拋出異常。它不會工作。你必須

1

問題是因爲兩個一個線程的threads.The例外不能被別人抓住。

在你的情況,你正在試圖趕上主線程new Thread(new Runnable() {--- }).start();

你需要捕捉裏面的線程0

  @Override 
      public void run() { 
      try{ 
       if(foo == null){ 
        //Only Exception that can be thrown from a Runnable 
        throw new RuntimeException("F.U.B.A.R."); 
       } 
       }catch(Exception ex){ 
       //In my opinion the way to catch this Exception 
       System.out.println(ex.getMessage()); 
       } 
      } 
1
異常啓動線程時可能出現異常

由於上面/下面有很多人指出你試圖用一個完全不同的線程在一個線程中捕捉異常,這意味着default exception handler is catching and handling it。如果你願意的話,你可以改變它,但在你正在使用的線程中捕獲異常並在那裏處理它通常是一個更好的主意。

如果你需要兩個線程相互交談,那麼你有幾個選擇,例如產生的線程捕獲異常並傳遞給它,使用ExecutorService,調用Future得到它,看看它是否拋出ExecutionException

您剛纔提到您正在使用TimerTask s。如果你可以移動到ScheduledThreadPoolExecutor那麼你可以使用Future方法。如果沒有,那麼你將不得不趕上例外的TimerTask,並通過事實,如果失敗回到主線程。