我试图了解异常是如何在多线程中传播的。
问题
在下面的示例中。为什么RuntimeException异常未被捕获
`System.out.println("Exception handled " + e); 给定代码
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 {添加抛球,但没有改变任何事情。
发布于 2021-01-07 17:29:05
您不能捕获线程在主线程中抛出的异常。但是,您可以实现Thread.UncaughtExceptionHandler来实现这一点。
公共静态接口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 interruptedhttps://stackoverflow.com/questions/65616757
复制相似问题