我试图学习异常如何在多线程中传播。
问题
在下面的示例中。为什么 RuntimeException
未捕获异常 System.out.println("Exception handled " + e); // Why not print this line
?
给定代码
package p05_Interrupt;
public class D05_Interrupt1 extends Thread {
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();
t1.start();
try {
t1.interrupt();
} catch (Exception e) {
System.out.println("Exception handled " + e); // Why not print this line
}
}
}
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()
线程被隐藏?
我还试着在 public void run() throws RuntimeException {
什么都没变。
1条答案
按热度按时间qvsjd97n1#
您无法在主线程中捕获线程抛出的异常(就像那样)。但是,您可以实现thread.uncaughtexceptionhandler来实现这一点。
公共静态接口thread.uncaughtexceptionhandler接口,用于在线程由于未捕获的异常而突然终止时调用的处理程序。
当线程由于未捕获的异常即将终止时,java虚拟机将使用thread.getuncaughtexceptionhandler()查询该线程的未捕获异常处理程序,并调用处理程序的uncaughtexception方法,将线程和异常作为参数传递。如果线程没有显式设置uncaughtexceptionhandler,则其threadgroup对象将充当uncaughtexceptionhandler。如果threadgroup对象对处理异常没有特殊要求,它可以将调用转发给默认的未捕获异常处理程序。
输出: