目录
线程的异常处理
可能出现的异常放到异常处理代码块中
设置线程全局的回调接口
线程异常处理知识点
实际业务
场景使用
线程的异常处理
线程中出现异常测试,没有进行异常处理
/**
* @author
* @date 2021年12月06日 17:20
* 异常处理
*/
public class ThreadTest01 {
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "开始运行");
//下面这个异常处理是处理sleep方法的
try {
Thread.sleep(2000);
}catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(12 / 0);
System.out.println(12 / 2);
}
});
t1.start();
}
}
Thread-0开始运行
Exception in thread "Thread-0" java.lang.ArithmeticException: / by zero
at ThreadTest01$1.run(ThreadTest01.java:18)
at java.lang.Thread.run(Thread.java:748)
Process finished with exit code 0
结论:后面的程序没有运行,并且发生异常没有进行处理
可能出现的异常放到异常处理代码块中
Thread-0开始运行
java.lang.ArithmeticException: / by zero
at ThreadTest01$1.run(ThreadTest01.java:15)
at java.lang.Thread.run(Thread.java:748)
6
结论:异常被捕捉到,并且后面程序继续执行,其实就是相当于主线程中的异常处理效果是一样的
设置线程全局的回调接口
public class ThreadTest01 {
public static void main(String[] args) {
//设置线程全局的回调接口
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e) {
System.out.println(t.getName() + "线程产生了异常" + e.getMessage());
}
});
Thread t1 = new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + "开始运行");
//下面这个异常处理是处理sleep方法的
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(12 / 0);
System.out.println(12 / 2);
}
});
t1.start();
new Thread(new Runnable() {
public void run() {
String txt = null;
System.out.println( txt.length()); //会产生空指针异常
} }).start();
}
}
结论:异常进行了适当的处理,发生异常后线程中断没有继续执行了
Thread-0开始运行
Thread-1线程产生了异常null
Thread-0线程产生了异常/ by zero
线程异常处理知识点
在线程的run方法中,如果有受检异常必须进行捕获处理,如果想要获得run()方法中出现的运行时异常信息 , 可以通过回调UncaughtExceptionHandler接口获得哪个线程出现了运行时异常.在Thread类中有关处理运行异常的方法有:
- getDefaultUncaughtExceptionHandler() 获得全局的(默认 的)UncaughtExceptionHandler
- getUncaughtExceptionHandler()获得当前线程的UncaughtExceptionHandler
- setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置全局的 UncaughtExceptionHandler
- setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)设置当前线程的 UncaughtExceptionHandler
- 当线程运行过程中出现异常 ,JVM会调用Thread类的dispatchUncaughtException(Throwable e) 方法 , 该方法 会调用getUncaughtExceptionHandler().uncaughtException(this, e); 如果想要获得线程中出现异常的信息 ,就需要设置线程的UncaughtExceptionHandler
实际业务
场景使用
- 在实际开发中,这种设计异常处理的方式还是比较常用的,尤其是异常执行的方法,如果线程产生了异常, JVM会调用dispatchUncaughtException()方法,在该方法中调用getUncaughtExceptionHandler().uncaughtException(this, e); 如果当前线程设置了UncaughtExceptionHandler回调接口就直接调用它自己的uncaughtException方法, 如果没有设置则调用当前线程所在线程组UncaughtExceptionHandler回调接口的uncaughtException方法,如果线程组也没有设置回调接口,则直接把异常的栈信息定向到System.err中
- 我的理解,就是设置了未捕捉异常处理器UncaughtExceptionHandler,该处理器里面重写了uncaughtException方法,里面定义获取相关的异常信息,然后将全局异常处理器放到默认的全局异常处理中,这样异常处理机制就配置好了
|