读本篇文章之前,如果让你叙述一下 Exception Error Throwable 的区别,你能回答出来么?
你的反应是不是像下面一样呢?
- 你在写代码时会经常 try catch(Exception)
- 在 log 中会看到 OutOfMemoryError
- Throwable 似乎不常见,但也大概听说过
一、Exception Error Throwable 关系
直接看下图,展示了三者之间的关系:
Throwable
是Error
和Exception
的父类。Exception
是程序正常运行中可预料的正常情况,应该被捕获并进行处理。- 又分为**可检查(checked)和不检查(unchecked)**异常。
- 可检查异常是在编译期检查的一部分,必须显示捕获处理。如有的方法 throw exception,那么调用该函数则必须 catch 处理或者再次 throw 出去交给下一层处理。
- 不检查异常一般指运行时异常(RuntimeException),类似
ArrayIndexOutOfBoundsException
、ArithmeticException
等。一般可由代码逻辑避免,可看情况是否捕获。
Error
一般是正常情况下不太可能出现的,绝大部分 Error 会导致程序处于不可恢复的状态,所以也不必捕获。如OutOfMemoryError
。
二、对比一个 Error 和 Exception
你在面试中也许会被问到:
NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
首先,我们看这俩名字,一个是 Error
另一个是 Exception
,从上面的介绍以及看下面的继承图可以得到:ClassNotFoundException
应是编码时要被捕获的异常,NoClassDefFoundError
是编译通过了,但运行时产生的重大问题。
进一步的:
ClassNotFoundException
是运行中动态加载类时出现的问题。
举例来说,使用 Class.forName
来动态加载一个类,如果你不显示的 catch 处理,ide 都会给你提示,并且也过不了编译。
// 错误写法
public void except() {
Class.forName("