异常的分类
非受检异常(unckecked exception):Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
受检异常(checked exception):除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。
所以受检和非受检的异常,他们的性质是不同的。受检异常程序员是可以处理的,或者说这种异常是允许发生的,是一种意料之内的情况,只不过程序员需要去处理,比如文件不存在这种客观情况。道理上来说,文件存不存在都是合理的,都是客观存在的一种情况,只不过我们的文件读写程序通常都针对文件存在的情况,所以这里受检的异常只是让我们额外处理文件不存在的情况。但是非受检异常的性质就不一样了,比如越界异常,这种就是程序的bug,我们通常都无法做出正确的处理,甚至说这种bug就不应该被catch住,就应该被抛出来,才能被发现,才能被修复。所以受检异常是一种合理的情况,但是非受检异常就是一种bug,是不应该发生的。这就是二者在逻辑上的区别。
总结:受检异常就是程序员写完程序无法决定运行的环境,由于运行环境不清楚,所以要声明一下受检异常的,这样jvm才会去识别到,然后执行对应的异常程序流程.

浙公网安备 33010602011771号