簡體   English   中英

捕獲RuntimeException

[英]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塊在主線程上捕獲異常,而在另一個線程上拋出異常。 它不會工作。 你必須

問題是因為有兩個線程,一個線程的異常無法被另一個線程捕獲。

在您的情況下,您試圖捕獲由主線程啟動線程時可能發生的異常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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM