介绍
异常,是异常是程序中的一些错误,但并不是所有的错误都是异常。
在实际开发中,有时候会有一些小的异常没有及时处理,在这些细微之处的异常抛出来之前,我们可以设置一个全局异常处理器,来把它们catch住,如果不这么做,异常堆栈信息就可能打印在前端,被用户看到,万一被黑客看到,拿到堆栈信息,就可能发现代码中的漏洞,从而发动攻击。
多线程的异常
当单线程的程序发生一个未捕获的异常时我们可以采用try….catch进行异常的捕获,但是在多线程环境中,线程抛出的异常是不能用try….catch捕获的,这样就有可能导致一些问题的出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。
示例:
1 |
|
运行结果:
1 | 1 |
可以看到在多线程中通过try….catch试图捕获线程的异常是不可取的。
JDK提供了UncaughtException用来处理多线程环境下的异常。
- 为什么需要这个类
- 主线程发生异常可以轻松发现,子线程发生异常却很难发现
- 子线程抛出的异常,会被淹没在主线程的输出之中,很难看到,并且无法影响主线程的运行
- 不能直接捕获异常,会导致程序错乱
两种解决方案:
- 在每个run方法内部使用 try catch (不推荐)
- 过于麻烦
- 利用Thread提供的 UncaughtExceptionHandler
UncaughtExceptionHandler接口
源码:
1 | public interface UncaughtExceptionHandler { |
此接口只有一个方法,参数:线程,异常,即对哪个线程抛出的什么异常进行处理
JDK的类ThreadGroup实现了UncaughtExceptionHandler接口,重写了其中的uncaughtException方法
1 | public void uncaughtException(Thread t, Throwable e) { |
- 如果发生异常的类有父类,就让父类去调用父类自定义的uncaughtException方法处理异常
- 如果没有父类,就使用创建Thread时set的defaultUncaughtExceptionHandler处理异常
- 如果没有给Thread set uncaughtException方法,就会输出错误信息,并打印堆栈信息
Java异常体系
–:代表不止一个
Error:发生了Error,就代表java本身也没办法帮助程序员处理,需要程序员自己解决,不能通过catch
Exception:
- RuntimeException:一旦发生,一定是程序员自己的问题,是编译器无法预测的,是UncheckedExceotion
- 其他的Exception(包括IOException):是能够被检查到的异常,checkedException
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/15/concurrent/2020-03-15-threadException/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!