1 语句的执行顺序
try{ } 中有个return 语句,那么紧跟在try后面的finally{ } 中的代码是否被执行?如果执行,什么时候被执行?是在return前还是return后?
例如这个函数:
public static int testFinally1(){
int res = 1;
try {
res = 2;
return res;
}catch (Exception e){
res = 3;
return res;
}finally {
System.out.println("finally1");
res = 4;
return 4;
}
}
当在main函数中使用
int res1 = testFinally1();
System.out.println(res1);
打印结果的时候,输出结果是:
这说明尽管try里面有return语句,finally中的代码还是会执行,另外,打印出来的是4而不是2,说明finally中的return会覆盖掉其他地方的return语句。
2 return的内容
同样对于上面的例子,如果将finally中的return去掉,结果会是怎么样的呢?
可以看到尽管finally中尝试改变res的值,但是最终return的值还是返回的try块中的res的值。这种情况只是对于基本类型的数据成立,对于引用类型的数据会有影响,如下例:
所以,可以这样理解:程序在执行return时会首先将返回值存储在一个指定的位置,其次去执行finally块,最后再返回。在testFinally1中执行finally前先将return的值(2)存储在一个指定位置,然后去执行finally中的代码,此时修改res的值并不会影响return的结果。但是在testFinally2中,虽然在执行finally前同样会将返回的结果存储在指定的位置,但是由于此时str是引用类型,在finally中修改str的值会修改返回的结果。
3 finally中的代码是否一定会被执行?
不一定。下面两种情况就不会执行finally中的代码:
(1)程序在进入try语句之前就出现了异常;
(2)try中有强制退出时,比如try中使用了语句:System.exit(0);