Java的例外体系非常强大,如图可以看出,Throwable是始祖,Erorr(错误)和Exception(异常)是二祖。另外Erorr和Exception下都有非常庞大和复杂的子嗣,而且队伍还在不断壮大中。

对Java例外体系的疑问_异常

Erorr的子嗣是一类底层的、无法挽回的错误,程序会因它们而立即退出。

Exception的子嗣是一类非底层的、可以挽回的异常,程序一般不会因它们立即退出。Exception的子嗣又可以分为两大类,一类称为已检查异常(Checked Exception),另一类称为未检查异常(Unchecked Exception),通常后一类又叫做Runtime Exception。

已检查异常与未检查异常有什么区别呢?为什么Java会将Exception分成这么两大类呢?Java这么做的目的是什么?

已检查异常常见的有文件未找到异常、IO异常、URL异常(用户打开了一个错误的URL)、SQL异常

未检查异常常见的有空指针异常数组下标越界异常、类型转换异常等。

已检查异常的发生通常不是因程序写的不对而产生的,而是由于其他方面引起的,它的发生不可控制,Java强制要求程序采取补救措施,即try...catch,或者throws让上一层try...catch。

而未检查异常一般都是由于程序写的有问题、程序的逻辑性不严密造成的,是程序员的问题,程序员应该自己避免出现这些问题,Java并没有强制要求采取try...catch或者throws。

注意Java中未检查异常都是从RuntimeException繁衍出来的。

对Java例外体系的疑问_异常_02

 换句话说自定义的未检查异常都要继承RuntimeException才行。

另一个问题是JavaSE API中将异常和错误从类中分开而各自独立介绍,是不是意味着我们不能讲异常和错误看做是类来对待呢?不过他们的祖先也是Object啊