看了老紫竹的昨天的关于finally的一个测试,想想他是个好人,又经常活跃在很多空间,对好人总得做点什么,想想也没什么可以做的,就发表个文章,总结一下毕业到现在两年来对异常处理的一些总结,如果有不对的地方,希望各位不要留情,狠狠拍砖,拍的越厉害提高越快,进入正题,有关最基本就不在重述了,像try catch 和fianlly之间的搭配和次序问题,异常处理中需要注意的几点:
1.如果其中有return语句,那么finally语句总是在return之前执行,这里要注意return的是对象还是像int,double等那样的,因为二者传值方式的不同,老紫竹的那个例子已经非常清楚了。
2.受检查异常和运行时异常要区分清楚,受检查异常一般都是在编译时会检查,运行时异常是在编译时不会检查,只有在运行中会发生,这个一般都是人为的操作不当造成,但是很多都是可以避免的,运行时异常其实就是RuntimeException以及的它的子类,其余的都是checked exception.如果对于受检查异常,那么如果用throw的时候,要么try catch要么throws,要不编译出错,看个例子能清楚些,
(1):
public class MyException extends Exception {
}
(2):
public class TestException {
public static void main(String[] args){
try{
a();
}catch(MyException e){
}finally{
b();
}
}
public static void a() throws MyException{
throw new MyException();
}
public static void b(){
throw new RuntimeException();
}
}
对于(2)中的方法b()虽然抛出了RuntimeException但是编译器不会检查,不用进行处理也可以编译通过,但是对a()如果把throws MyException去掉,编译时不会通过的。如果不明白试试就会明白了。
对了忘记说了,如果程序中存在exit(0)finally也有可能不被执行,这个在非桌面的应用中暂时还没见过,不做讨论。
3.catch后边跟的各种异常要按照从小到大的顺序,否则会有编译不到而出错的情况。
4.a方法调用b方法,如果b方法需要异常处理,那么b中要么处理,处理不了抛出,抛出后在a中处理,处理不了依旧抛出,注意这里异常处理的范围也就是子类与父类的关系。
5.关于方法覆盖,还是范围问题。
6.异常处理中需要的注意的问题:能避免的避免,也就是说只能用于非正常情况(似乎是废话,但做到有时会很难),try catch要及时对可能出现的异常进行处理,剩下的暂时想不起来,其实我觉得似乎都是废话。
7.程序中经常使用的相关处理方式,(1),异常重新包装,或者自定义异常,有的书里叫异常转译,自定义异常中可以对很多异常一起处理,也叫多样化异常。
写了1小时了,时间关系,有些点我就不详细说了,有不明白的再说了,欢迎拍砖。