异常处理中,try、catch、finally的执行顺序,大家都知道是按顺序执行的。即,如果try中没有异常,则顺序为try→finally,如果try中有异常,则顺序为try→catch→finally。
如下代码try、finally中都对变量做了改变,针对这种情况对返回值进行分析
public static int test(){
int i = 10;
try{
System.out.println("执行try:1" );
return i+=20;
}catch (Exception e){
System.out.println("执行catch:2");
}finally {
System.out.println("执行finally:3");
i = 150;
}
return i;
}
输出:
执行try:1
执行finally:3
30
分析:
在try语句中,在执行return语句时,要返回的结果已经准备好了,就在此时,程序转到finally执行了。在转去之前,try中先把要返回的结果存放到不同于 i 的局部变量种去,执行完finally之后,在从中取出返回结果,因此,即使finally中对变量 i 进行了改变,但是不会影响返回结果。它应该使用栈保存返回值。
结论:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。