为什么捕获多线程运行期间异常
在讲为什么要捕获多线程运行期间异常时,先写个栗子:
public class MyThread {
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
throw new RuntimeException();
}
};
try {
thread.start();
}catch(RuntimeException e) {
System.out.println("Exception");
e.printStackTrace();
}
}
}
打印结果:
Exception in thread “Thread-0” java.lang.RuntimeException
at com.Reyco.MyThread.MyThread$1.run(MyThread.java:10)
这里的打印结果并没有打印处catch块中的System.out.println(“Exception”)的内容。我们发现异常直接被抛到了控制台,没有被捕获
结论:多线程运行不能按照顺序执行过程中捕获异常的方式处理异常,异常会被直接抛到控制台,使得我们不能捕获从线程中逃逸的异常。一旦异常逃逸处任务的run()方法,就直接抛到控制台。这样我们很难针对可能会产生的异常进行解决。
多线程中捕获异常
1.定义异常处理器(实现Thread的UncaughtExceptionHandler接口)
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler{
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.println("捕获异常"+e);
}
}
测试类
public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
throw new RuntimeException();
}
};
//设置异常处理器
thread.setUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
thread.start();
}
打印结果:
捕获异常java.lang.RuntimeException