标签:try-catch
我们平常所说的try-catch,throw均针对可查异常。
关于异常分类,请查看Java中的异常
一旦某个catch语句捕获到异常,将进入异常的处理代码,直到处理结束,整个try-catch语句结束,后面的其他的catch即使有异常也无法匹配进入。
另一个关于执行顺序的例子如下:
public boolean test1(){
boolean b = true;
try {
System.out.println("in try");
return b;
} finally{
b = false;
System.out.println("in finally , b:"+b);
}
}
public int test2(){
int b = 0;
try {
throw new Exception();
} catch (Exception e) {
++b;
System.out.println("in catch , b:"+b);
return b;
}
finally{
++b;
System.out.println("in finally, b:"+b);
//return b;
}
}
test1输出结果:
in try
in finally , b:false
返回true
test2输出结果:
1
2
返回1
test2原因:当异常抛出,进入catch,++b,此时b为2。在return之前,由于存在finally,因此先进入finally,++b,此时b为3,但是,对于要返回的值b,在进入finally之前,jvm复制一个b保存在catch的return之前,然后另一个b进入finally被修改。最后从finally出来,继续走return,这是返回的依然是之前保留的b。
注意,只有走到return的时候才会进入finally,因此只有return的变量才会有这样的现象。
同理适用于test1。
总结:
1.不管是否异常,finally块中的语句都会执行;
2.当try或catch块中有return语句时,finally块中的语句仍会执行;
3.finally块中的语句是在函数返回前执行的,但函数返回值是在finally块中语句执行前确定的;
附加:一般finally中不建议写return语句,虽然不会报错,但是很不安全。
标签:try-catch
原文地址:http://blog.csdn.net/langduhualangdu/article/details/45177017