Java里Finally的一些细节

本篇博客的例子来自《码出高效 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语句。

猜你喜欢

转载自blog.csdn.net/Akanarika520/article/details/83112557