Thread如何捕获异常

前言

参照Think in Java
PS:只为了自己学习与查找,欢迎指正和提问

由于线程的本质特性,使得你不能捕获从线程中逃逸的异常。一旦异常逃出任务的run()方法,它就会想外传播到控制台,除非你采取特殊的步骤捕获这种错误的异常。在Java SE5之前,你可以使用线程组来捕获这些异常,但是有了Java SE5,就可以用Executor来解决这个问题,因此你就不再需要了解有关线程组的任何知识了。
Thread.UncaughtExceptionHandler是Java SE5 中的新接口,它允许你再每个Thread对象上都附着一个异常处理器。Thread.UncaughtExceptionHandler()会在线程因未捕获的异常而面临死亡是被调用。

     public static void main(String[] args) {

        Thread.setDefaultUncaughtExceptionHandler((t,e)->{
        //默认的异常处理器
            System.out.println("default"+e.toString());
        });

        Thread thread = new Thread(() -> {
                throw new RuntimeException("error ");
        });

        thread.setUncaughtExceptionHandler((t, e) -> {
        //异常处理器
            System.out.println("thread :"+e.toString());
        });

        thread.start();
    }

如果你知道将要在代码中处处使用相同的异常处理器,那么更简单的方式是在Thread类中设置一个静态域,并将这个处理器设置为默认的未捕获异常处理器Thread.setDefaultUncaughtExceptionHandler(),这个处理器只有在不存在线程专有的未捕获异常处理器的情况下才会调用。系统会检查线程专有版本,如果没有发现,则检查线程组是否有其专有的uncaughtException(),如果也没有,再调用defaultUncaughtExceptionHandler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值