线程的未捕获异常UncaughtException应该如何处理?

可以使用UncaughtExceptionHandler,有以下的原因:

首先应该注意:try/catch只能捕获对应线程内的异常,不同的线程组合在一个用try/catch进行包起来不能进行捕获

  • 主线程可以轻松发现异常,而子线程不行

        子线程的异常不会影响到主线程的执行,即使子线程有异常抛出,并且打印了异常信息,主线程依然能够正常运行

  • 子线程异常无法用传统方法进行捕获

      不能用try/catch将众多线程包括在一起捕获异常,比如:假如我们有4个线程,我们用try/catch将4个线程包起来,且run方法用throw 抛出运行时异常,4个线程都是用的run方法,我们的原先的目的是想让捕获到第一个线程的异常,且2,3,4线程停止运行,但是结果是2,3,4线程依然运行,但是在catch里面的异常信息没有打印,也就是没有进行捕获。即子线程的异常不能用传统的方法进行捕获

  • 不能直接捕获的后果,

        结果是子线程停止运行,打印堆栈信息,然而我们的业务逻辑没有去执行,

对于上述子线程异常无法捕获的情况,可以有二种解决方案

  1. (不推荐):手动在每个run方法里面使用try/catch进行捕获,我们在每个run方法里面捕获,也就是每个线程都捕获,使用try/catch,肯定能捕获到,缺点是每个run方法都要写一个try/catch,麻烦
  2. 利用UncaughtExceptionHandler

          这个接口可以检测出由于未捕获异常而终止的情况,并且对此进行处理

          实现:

          用一个新建的类实现Thread.uncaughtExceptionHandler接口并重写uncatchException方法,在方法里面打印错误信息

         在实现Runable接口的类中,调用Thread.setDefaultExceptionHandler方法

常见面试问题:

1.java异常体系

2.如何全局处理异常?如果抛出异常,不处理行不行?

      用一个全局处理类,根据业务需要对前端进行处理,以及后端内部日志打印,不处理是不行的,理由如上

3.run方法是否可以抛出异常?如果抛出异常,线程的状态是怎么样的?

      不能向外抛出异常,如果抛出的是RuntimeException,线程会停止。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值