08. 线程异常捕获

java 多线程系列文章列表, 请查看目录: 《java 多线程学习笔记》

1. 线程的异常捕获

1.1 线程异常的捕获

  • 从java5 开始, Java 加强了对线程异常的处理. 如果线程执行过程中抛出了一个未处理的异常, JVM在结束该线程之前, 会自动查找该线程是否拥有对应的线程异常处理器对象, 若找到之后, 则调用异常处理器的方法处理异常.
  • java5 之前通常都会使用try-catch, 包裹run()/callable()方法, 这样代码会有些臃肿

1.2 设置异常处理器

Thread 提供了两个方法来设置线程异常处理器:

  • public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler eh): 为该线程类的所有实例设置默认的异常处理器
  • public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) : 为指定的线程实例设置异常处理器.

1.3 异常处理器顺序

  • 如果线程对象设置了异常处理器, 则优先使用线程对象的异常处理器
  • 如果线程对象未设置异常处理器, 但是线程类设置了异常处理器, 则使用线程类的异常处理器
  • 如果线程类也未设置异常处理器, 则调用父线程组的uncaughtException方法. 线程组ThreadGroup 实现了UncaughtExceptionHandler 接口

2.1 自定义线程异常

2.2 测试用例

public class ThreadExcp {


    static class MyThread extends Thread{

        @Override
        public void run() {
            int a = 1/0;
        }
    }

    public static void main(String[] args) {

        // 1. 线程类默认异常处理器
        Thread.UncaughtExceptionHandler defaultEh = new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("默认异常处理器-捕获到了异常.." + e.getMessage());
            }
        };

        // 2. 线程对象异常处理器
        Thread.UncaughtExceptionHandler objEh = new Thread.UncaughtExceptionHandler() {
            @Override
            public void uncaughtException(Thread t, Throwable e) {
                System.out.println("私有异常处理器-捕获到了异常.." + e.getMessage());
            }
        };

        // 设置默认异常处理器
        MyThread.setDefaultUncaughtExceptionHandler(defaultEh);

        MyThread myThread = new MyThread();
        
        // 设置类对象异常处理器
        myThread.setUncaughtExceptionHandler(objEh);

        // 启动线程
        myThread.start();

    }

}

2.2 输出

从输出结果可以看出, 优先使用线程对象的异常处理器.

私有异常处理器-捕获到了异常../ by zero
发布了321 篇原创文章 · 获赞 676 · 访问量 147万+

猜你喜欢

转载自blog.csdn.net/zongf0504/article/details/100186134