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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值