2012-11-27 31 views
0

我設法繞過try catch塊, 嵌套多個線程。在這種情況下,try catch被繞過java?

是否存在一些規則,它在何處被記錄,當try catch塊被異常繞過?

try{ 
    Runnable r = new Runnable() { 

    @Override 
    public void run() { 
     System.out.println("Thread"); 

     Display.getDefault().syncExec(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("ThreadGUI"); 
      throw new NullPointerException(); 
     } 
     }); 

    } 
    }; 

    Thread t = new Thread(r); 
    t.start(); 

} catch(NullPointerException e) { 
    //nothing 
} 

System.out.println("Ende"); 
+1

只是因爲線程A啓動了引發異常的線程B並不意味着線程A將收到B的異常。 –

+1

不太確定你在這裏期待什麼。異常發生在另一個線程中。 – tmyklebu

+1

你爲什麼要在不同的線程中運行它? – ShyJ

回答

4

異常不會自動跨越線程邊界傳播。如果您在特定線程中拋出異常,則只能在該線程中捕獲它。你的代碼的詞法結構在這方面沒有任何區別。

以下是JLS的相關部分:

在拋出異常的過程中,Java虛擬機突然完成後,一個接一個,任何表達式,語句,方法和構造函數調用,初始化,以及在當前線程中已經開始但未完成執行的字段初始化表達式。這個過程一直持續到找到一個處理程序,它通過命名異常類或異常類的超類(§11.2)來處理該特定異常。如果沒有找到這樣的處理程序,那麼可以通過未捕獲的異常處理程序(§11.3)中的一個來處理異常 - 因此我們盡一切努力避免異常處理。

...

如果可以找到能夠處理異常沒有catch條款,那麼當前線程(即遇到異常的線程)終止。

0

你的異常在不同的線程中拋出。這就是爲什麼它沒有被捕獲。你可能想在新的線程中捕捉它,並以某種方式將它傳播到主線程。

+0

這是記錄在某處嗎? – Skip

+0

@Skip是的。請參閱'Java語言規範'。 – ShyJ