为什么在这个多线程示例中没有捕获异常?

我试图了解异常如何在多线程中传播。

在下面的例子中。为什么RuntimeException异常没有被捕获

`System.out.println("Exception handled " + e); 

给定代码

`System.out.println("Exception handled " + e); 

JavaTpoint 中的第一个示例“中断停止工作的线程的示例”

输出

Exception in thread "Thread-0" java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted
    at p05_Interrupt.D05_Interrupt1.run(D05_Interrupt1.java:9)

是不是因为这是多线程,所以在线程中打印异常t1main()隐藏线程的输出?

我还尝试添加 throws atpublic void run() throws RuntimeException {没有改变任何东西。

回答

您无法捕获(像那样)线程中的 Thread 抛出的异常。但是,您可以实现Thread.UncaughtExceptionHandler来实现这一点。

public static interface Thread.UncaughtExceptionHandler当线程由于未捕获的异常突然终止时调用的处理程序接口

当线程由于未捕获的异常而即将终止时,Java 虚拟机将使用 Thread.getUncaughtExceptionHandler() 查询线程的 UncaughtExceptionHandler 并将调用处理程序的 uncaughtException 方法,将线程和异常作为参数传递。如果一个线程没有显式设置它的 UncaughtExceptionHandler,那么它的 ThreadGroup 对象作为它的 UncaughtExceptionHandler。如果 ThreadGroup 对象对处理异常没有特殊要求,它可以将调用转发到默认的未捕获异常处理程序。

public class D05_Interrupt1 extends Thread 
        implements Thread.UncaughtExceptionHandler {

    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("task");
        } catch (InterruptedException e) {
            throw new RuntimeException("Thread interrupted..." + e);
        }
    }

    public static void main(String args[]) {
        D05_Interrupt1 t1 = new D05_Interrupt1();
        Thread.setDefaultUncaughtExceptionHandler(t1);
        t1.start();
        t1.interrupt();
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Exception handled " + e); // Why not print this line
    }
}

输出:

Exception handled java.lang.RuntimeException: Thread interrupted...java.lang.InterruptedException: sleep interrupted


以上是为什么在这个多线程示例中没有捕获异常?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>