本篇博客的例子来自《码出高效 Java开发手册》,这本书确实很耐看。很多细节。
接下来看代码一:
public class TryCatchFinally {
public static void main(String[] args) {
int temp = finallyNotWork();
System.out.println(temp);
}
public static int finallyNotWork(){
int temp =10000 ;
try {
throw new Exception();
}catch (Exception e){
return ++temp ;
}finally {
temp =99999;
System.out.println(temp);
}
}
}
输出结果是 :
99999
10001
我们都知道不管发生不发生异常,finally语句是肯定会执行的。此时main方法里输出的temp是10001,是因为,finally语句是在return表达式执行后才执行的。①、在以上代码中,发生了异常,所以跳到catch语句里,此时我们要return返回的 ++temp(10001)的值已经被保存起来了。②然后我们执行了finally语句,将temp的值设为99999,③等finally语句执行完之后我们这里要返回的值是之前保存起来的值10001,而不是99999。在方法里temp的值确实是被改变了,所以第一行输出的是99999.
接下来看代码二:
public class TryCatchFinally {
static int x =1 ;
static int y =10 ;
static int z =100 ;
public static void main(String[] args) {
int value = finallyReturn();
System.out.println("value = " + value);
System.out.println("x = " + x);
System.out.println("y = " + y);
System.out.println("z = " + z);
}
private static int finallyReturn() {
try {
return ++x ;
}catch (Exception e){
return ++y ;
}finally {
return ++z ;
}
}
}
输出结果如下:
value = 101
x = 2
y = 10
z = 101
执行程序首先到了 return ++x ; 但是与第一张图中不同的是,我们这里的finally代码块里也有return语句。所以最终这个静态方法的返回值是 finally里的return, 即++z ,即 101 。 而 x的值,因为成功执行了 ++x的缘故,值变成了2 。
所以:
finally代码块的职责不是对于变量进行赋值的操作,而是清理资源,释放连接,关闭管道流等操作。如果在finally代码块中使用return语句,会使得返回值的判断变得复杂,所以避免返回值不可控,我们不要在finally语句块里使用return语句。