[英]Catch RuntimeException
在編碼期間,我想從Runnables中捕獲一些異常。
我嘗試使用以下代碼捕獲異常的代碼:
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());
}
}
我期望看到的輸出是:
富巴
我得到的輸出:
線程“ Thread-0”中的異常java.lang.RuntimeException:FUBAR
我需要它的原因是將這個Exception放入自己的Exception中,以便我可以正確地對其進行處理。
有誰知道如何獲得預期的輸出而不是我的當前輸出?
因為構造Runnable並在try和catch之間執行.start()不會引發異常。 線程執行“ run”方法時,稍后會引發運行時異常。
當前的catch塊在主線程上捕獲異常,而在另一個線程上拋出異常。 它不會工作。 你必須
run()
方法的主體 問題是因為有兩個線程,一個線程的異常無法被另一個線程捕獲。
在您的情況下,您試圖捕獲由主線程啟動線程時可能發生的異常new Thread(new Runnable() {--- }).start();
您需要在Thread-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());
}
}
正如我上面/下面的許多人所指出的,您正在嘗試在一個線程中使用完全不同的線程捕獲異常,這意味着默認異常處理程序正在捕獲並處理該異常 。 您可以根據需要進行更改,但是通常最好是在正在使用的線程中捕獲異常並在那里進行處理。
如果您需要兩個線程互相通信,那么您可以有一些選擇,例如,生成的線程捕獲異常並將其傳遞給使用ExecutorService ,調用Future上的get並查看它是否拋出ExecutionException 。
您已經提到您正在使用TimerTask 。 如果可以移至ScheduledThreadPoolExecutor,則可以使用Future方法。 如果不是,那么您將必須捕獲TimerTask異常,並將失敗的事實傳遞回主線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.