所有异常都是由Throwable继承而来,但是在下一层即分为了Error和Exception。
- Error类层次结构描述了Java运行时系统的内部错误或者资源耗尽错误,应用程序不应该抛出这种类型的对象。如果出现这样的内部错误,除了通知给用户并尽力使得程序安全的终止外,再也无能为力了。这种情况很少出现。
- Exception层次又分为两个分支,一个是RuntimeException,另一个分支包含其他异常。由程序错误导致的异常是RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。
派生于RuntimeException的异常包含下面几种情况:
- 错误的类型转换
- 数组访问越界
- 访问NULL指针
不是派生于RuntimeException的异常包括:
- 试图在文件尾部后面读取数据
- 试图打开一个不存在的文件
- 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。(反射)
“如果出现RuntimeException,那么一定是你的问题”,是一条相当有道理的规则。
Java语言规范将派生与Error类和RuntimeException类的所有异常称为非受检异常,所有其他的异常称为受检异常。
一个方法必须声明所有的受检异常并捕获处理(使用try catch finally或throws或throw)
而非受检异常要么不可控(Error),要么就应该避免发生(RuntimeException)。
异常的捕获、抛出和异常处理是维持代码健壮性的重要条件。灵活使用异常及处理,不仅能最大限度的避免出错,也能增加软件的容错机制。