最近使用线程池时,了解到了在子线程中抛出异常,主线程的处理方式。
Java中抛出 Exception 时必须使用 try..catch 块处理,但是抛出 RuntimeException 和 Error 时可以不使用 try..catch 块来处理,但是会导致线程中断。如下为抛出RuntimeException代码示例:
public class ChildThread implements Runnable{
@Override public void run() {
System.out.println("进入子线程");
throw new TestException();
}
}
class TestException extends RuntimeException{
public TestException(){
super("我是Exception");
}
}
但是抛出Exception时会要求处理:
在子线程中如果抛出异常的话,主线程是不会感受到这个异常的,并且也不能通过 try..catch 来捕获这个异常,但是如果子线程是继承了 Thread 的话是可以通过 Thread.setUncaughtExceptionHandler 方法来捕获到这个异常并进行处理的。如下为主线程捕获子线程异常代码示例:
public class ThreadTest {
public static void main(String[] args) {
new ThreadThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { System.out.println(t.getName()+" "+e.getMessage());
}
});
System.out.println("主线程完成");
}
}
class ThreadThread extends Thread {
@Override public void run(){
System.out.println("ASDASDASD");
}
}
版权声明:本文为qq_34999633原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。