为什么在这个多线程示例中没有捕获异常?
我试图了解异常如何在多线程中传播。
题
在下面的例子中。为什么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)
是不是因为这是多线程,所以在线程中打印异常t1,main()隐藏线程的输出?
我还尝试添加 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