2011-06-11 209 views
2

我想討論一件事情是,當線程中run方法的主體發生異常時,它將反映在哪裏(調用者)以及如何處理此問題。Java異常處理

這裏是我的代碼:

class MyThread extends Thread{ 
     public void run() throws IllegalInterruptedException{ 
       Thread.currentThread().sleep(1234); 
     } 
} 

那麼誰(來電)將管理此異常。

回答

0

如果我理解得很好,您希望能夠處理在另一個線程中觸發的異常。看看是,setDefaultUncaughtExceptionHandler,一個頁面樣本:

Java2S

+0

我在問:爲此代碼: – Anuj 2011-06-11 15:15:38

+0

好吧,比我的回答站 – 2011-06-11 15:26:27

0

異常是由一個程序時發生了異常的發生異常。一般教程可用here,但總結是,你的程序將與找到的東西來處理它的希望拋出異常的類內搜索:也許catch語句,如:

catch (IllegalInterruptedException e) { 

//what you want the program to do if an IllegalInterruptedException 
//is thrown elsewhere and caught here. For example: 

System.err.println("program interrupted!" + e.getMessage()); 

} 

如果你的程序可以」 t在拋出該語句的類中找到一個catch語句,它會查找某個東西在父類中處理它。請注意,拋出異常時,拋出異常時子類所做的任何操作都會停止。出於這個原因,你應該把可能拋出異常的代碼塊放在'try'塊中,然後用你想在'finally'語句中執行的任何內容來執行它,無論如何它都會執行。

上面鏈接的教程真的很有幫助。

+0

[this](http://stackoverflow.com/questions/536811/doubt-in-exception-handling-and-finally-block-in -java)在SO的其他地方也是一個有用的答案。 – Charlie 2011-06-11 15:37:20

+0

你沒有真正回答這個問題,這是關於多線程環境中的異常情況(即哪個線程獲取異常以及它如何傳播)的問題。另外,異常不會在父類中處理,而是在調用鏈上。 – 2011-06-11 17:37:20

0

你可以看到run()main()並得到你自己的答案。 但我不認爲你可以覆蓋run()並宣佈new nonRuntime-Exceptions ..所以你會得到一個編譯錯誤。
PS:我找不到IllegalInterruptedException,也許你想說InterruptedException

+0

是的,你絕對正確,但沒有經過檢查異常 – Anuj 2011-06-11 17:46:32

+1

未經檢查的異常是延長RuntimeException的異常。我將Checked Exceptions稱爲nonRuntime-Exceptions。 – 2011-06-11 18:22:42

1

有2種不同的情況:

  • JVM傳遞異常的異常處理程序,如果已經安裝了線程組。
  • 否則,JVM會處理它。

樣例程序:

public class ThreadGroupDemo extends ThreadGroup { 
    public ThreadGroupDemo() { 
     super("This is MyThreadGroupDemo"); 
    } 
    public void uncaughtException(Thread t, Throwable ex) { 
     // Handle your exception here .... 
    } 
} 

Thread t = new Thread(new ThreadGroupDemo(), "My Thread") { 
     // Some code here ...... 
}; 

t.start(); 

注:退房this link.

+0

thanx,但我可以使用它作爲uncheckedException。 – Anuj 2011-06-11 17:49:58

0

還有另一個選擇 - 做任務可贖回和使用執行人提交它。當你獲得未來時,你會自動包裝任何異常。