我们都知道,线程运行期间是不可以往外抛出异常的,这时候我们就需要通过别的方式来捕获到异常信息
先看一下普通捕获异常的方式
public class ThreadException {
private final static int A = 10;
private final static int B = 0;
public static void main(String[] args) {
//创建两个线程
Thread t1 = new Thread(()->{
int result = A/B; //明显可以看出这行代码会报异常
System.out.println(result);
});
t1.start();
Thread t2 = new Thread(()->{
while (true){
try {
Thread.sleep(1_000);
System.out.println("线程异常捕获测试小案例");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
})
t2.start();
}
}
运行结果是不是跟我们想象的一样
可以看出来,t1线程发生了运行时异常,已经终止运行,但是t2线程还在继续执行,这样的异常信息我们只能通过控制台或者log文件才会看到,但是如何在外部知道某个线程发生异常了呢?setUncaughtExceptionHandler
setUncaughtExceptionHandler
调用当前线程的setUncaughtExceptionHandler方法就可以了,看一下代码
public class ThreadException {
private final static int A = 10;
private final static int B = 0;
public static void main(String[] args) {
Thread t1 = new Thread(()->{
int result = A/B;
System.out.println(result);
});
t1.start();
t1.setUncaughtExceptionHandler((t,e)->{
System.out.println(e);
System.out.println(t);
});
Thread t2 = new Thread(()->{
while (true){
try {
Thread.sleep(1_000);
System.out.println("线程异常捕获测试小案例");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
}
}
运行结果是
可以看出来,异常信息已经被我捕获到了,并且我们还可以捕获是哪个线程发生的异常,以及它的优先级、ThreadGroup等信息,这样我们从外部也就可以看到异常信息了。