Catch RuntimeException

时间:2015-10-14 12:18:41

标签: java multithreading exception-handling runnable

在编码期间,我想从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());
    }
}

我期望看到的输出是:
F.U.B.A.R。

我得到的输出:
线程“Thread-0”中的异常java.lang.RuntimeException:F.U.B.A.R。

我需要这个的原因是把这个Exception放到我自己的位置,所以我可以正确地使用它。

有谁知道如何获得预期的输出而不是当前的输出?

4 个答案:

答案 0 :(得分:3)

因为在try和catch之间构造Runnable并执行.start()没有抛出异常。当线程执行“run”方法时,稍后引发运行时异常。

答案 1 :(得分:2)

当前的catch块在主线程上捕获异常,而在另一个线程上抛出异常。它不会起作用。你必须

答案 2 :(得分:1)

问题是由于两个线程。一个线程的例外不能被另一个线程捕获。

在您的情况下,您试图捕获主线程update table set number = columnA * columnB, var1 = columnA * columnB * (case when lower(columnC) like '%aaa%' then 1 when lower(columnC) like '%bbb%' then 2 when lower(columnC) like '%ccc%' 4 else 1 end), var2 = number / var1 var2 = (case when lower(columnC) like '%aaa%' then 1/1.0 when lower(columnC) like '%bbb%' then 1/2.0 when lower(columnC) like '%ccc%' 1/4.0 else 1.0 end); 启动线程时可能发生的异常

您需要捕获Thread-0

中的异常
else

答案 3 :(得分:1)

正如我上面/下面的许多人所指出的那样,你试图在一个线程中捕获异常并且线程完全不同,这意味着default exception handler is catching and handling it。如果您愿意,可以更改它,但通常最好在您正在使用的线程中捕获异常并在那里处理它。

如果您需要两个线程相互通信,那么您有几个选项,例如生成的线程捕获异常并将传递传递给使用ExecutorService,调用get Future 3}}并查看它是否会抛出ExecutionException

您提到过您正在使用TimerTask。如果您可以转到ScheduledThreadPoolExecutor,那么您可以使用Future方法。如果没有,那么你将不得不捕获TimerTask的异常,如果失败则返回主线程。