捕获运行时异常

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());
    }
}

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

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

我需要这个的原因是将这个异常放入我自己的异常中,这样我就可以正确地使用它。

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

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

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

问题是因为一个线程的两个threads.The异常不能被另一个线程捕获。

在你的例子中,你试图捕获一个异常,该异常可能在主线程启动线程时发生 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());
              }
            }

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

如果您需要两个线程相互通信,那么您有几个选择,例如生成的线程捕获异常并将其传递过来,或者使用 ExecutorService, calling get on the Future and seeing if it throws a ExecutionException

您提到您正在使用 TimerTasks. If you can move to ScheduledThreadPoolExecutor 那么您可以使用 Future 方法。如果不是,那么您将不得不捕获 TimerTask 的异常,并在失败时将事实传递回主线程。