一.总体看下JDK的异常层次关系,如下UML图:
二.看一段代码说明:
三.总结说明:
1.Java提供了两类主要的异常:runtime exception和checked exception。所有的checked exception是从java.lang.Exception类衍生出来的,而runtime exception则是从java.lang.RuntimeException或java.lang.Error类衍生出来的
2.在程序的运行过程中一个checked exception被抛出的时候,只有能够适当处理这个异常的调用方才应该用try/catch来捕获它。而对于runtime exception,则不应当在程序中捕获它。如果你要捕获它的话,你就会冒这样一个风险:程序代码的错误(bug)被掩盖在运行当中无法被察觉。
3.不能在finally块中执行return,continue等语句,否则会把异常“吃掉”;
4.在try,catch中如果有return语句,则在执行return之前先执行finally块;
5.对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常(不要把自己能处理的异常也抛给调用者);
6.throw语句后不允许有紧跟其他语句,因为这些没有机会执行;
注意:
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的 异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。