可以使用UncaughtExceptionHandler,有以下的原因:
首先应该注意:try/catch只能捕获对应线程内的异常,不同的线程组合在一个用try/catch进行包起来不能进行捕获
- 主线程可以轻松发现异常,而子线程不行
子线程的异常不会影响到主线程的执行,即使子线程有异常抛出,并且打印了异常信息,主线程依然能够正常运行
- 子线程异常无法用传统方法进行捕获
不能用try/catch将众多线程包括在一起捕获异常,比如:假如我们有4个线程,我们用try/catch将4个线程包起来,且run方法用throw 抛出运行时异常,4个线程都是用的run方法,我们的原先的目的是想让捕获到第一个线程的异常,且2,3,4线程停止运行,但是结果是2,3,4线程依然运行,但是在catch里面的异常信息没有打印,也就是没有进行捕获。即子线程的异常不能用传统的方法进行捕获
- 不能直接捕获的后果,
结果是子线程停止运行,打印堆栈信息,然而我们的业务逻辑没有去执行,
对于上述子线程异常无法捕获的情况,可以有二种解决方案
- (不推荐):手动在每个run方法里面使用try/catch进行捕获,我们在每个run方法里面捕获,也就是每个线程都捕获,使用try/catch,肯定能捕获到,缺点是每个run方法都要写一个try/catch,麻烦
- 利用UncaughtExceptionHandler
这个接口可以检测出由于未捕获异常而终止的情况,并且对此进行处理
实现:
用一个新建的类实现Thread.uncaughtExceptionHandler接口并重写uncatchException方法,在方法里面打印错误信息
在实现Runable接口的类中,调用Thread.setDefaultExceptionHandler方法
常见面试问题:
1.java异常体系
2.如何全局处理异常?如果抛出异常,不处理行不行?
用一个全局处理类,根据业务需要对前端进行处理,以及后端内部日志打印,不处理是不行的,理由如上
3.run方法是否可以抛出异常?如果抛出异常,线程的状态是怎么样的?
不能向外抛出异常,如果抛出的是RuntimeException,线程会停止。