未检查异常和已检查异常
所有派生自Error和RuntimeException的类,都是未检查异常.其余的是已检查异常.
未检查异常意思就是说,编译器不会检查程序是否抛出异常,换句话说,程序员可以不用使用try-catch来捕获异常,比如NullPointerException
Throwable接口是JVM用来判断是不是可以throw。
Error是Throwable的一个子类,这个类以及其子类不需要java程序强制catch,当然你也可以catch,或者说有时候最好catch。Error的意思是java虚拟机内部出现了问题,而不是某个code block有问题,比如说,OutOfMemoryError是没有内存了,LinkageError是class文件不合法之类的。这些东西开始学java可以先不必理会。等学到一定level再慢慢理解更好。 Exception就是我们平时编程的时候打交道的异常的父类。它实现了Throwable。Exception分两种,一种是编译期异常,一种是运行期异常(RuntimeException的子类),编译期异常就是客观上可以通过java编译期可以检测出的并且需要coder处理的异常,比如IOException,只要有IO操作(比如读取文件或者操作Socket)就有可能会有IOException,所以java把IOException定为编译期异常。编译期异常要求coder必须catch或者throw。运行期异常就是在编译期间无法确定的异常,所以不需要coder处理。比如NumberFormatException,NullPointException等等,只有在真正程序运行起来才知道会不会有错误,编译期是不可能知道的,有些运行期异常最好也catch,比如NumberFormatException,catch了以后可以复个default value,比如0 或者 -1,否则程序可能就走不下去了。 至于java为什么把一个异常定为运行期异常或者编译期异常,我想还是Sun的工程师根据自己经验或者惯例来的吧。比如NumberFormatException,这个也完全可以是编译期异常,只要有字符转数字的地方都有可能发生此异常。但如果这样,我们的code里面可能就充斥着很多很多的try-cacth block了,如果NullPointException定为编译期异常,那整个java就没有一行code不在try-catch block里面了 :)。
当然如果是应付面试,你可以说java就两种异常,一种是编译期异常,需要coder自己编程处理:catch住或者throw出去,一种是运行期异常,不需要编程处理,但是为了程序的容错性,也可以catch住处理或者throw。
|