Java面试try catch finally中return的问题详细分析以及更深层次的问题剖析

如题,这是Java面试经常遇到的问题。究竟是会reture try里的值还是finally中的值,亦或者finally中会执行吗?下面我们通过代码来分析:

1 public static int practiceOne(){
2         try {
3             System.out.println("try is running");
4             return 1;
5         } finally {
6             System.out.println("finally is running");
7             return 2;
8         }
9     }

这里输出的结果是:

try is running
finally is running
2

我们可以看到finally的语句被执行了,因为不管是执行try 还是执行catch 最后都会执行finally中的代码。但是在try return 之前会去执行finally的代码。但是finally的代码中有return 所以程序就return了之后结束了。所以返回的是2。下面我们在加一点难度迷惑一下大家

public static int practiceTwo(){
        int num=10;
        try {
            num=20;
            return num;
        }finally{
            num=30;
        }
    }

这里输出的结果是:20。其实,在try 的return 之前已经封存了要返回对象所指向的内存地址。就是说在执行finally之前。程序已经确定了要返回的值的所在的内存地址,而这个内存地址的值就是20所以不会因为finally改变值所影响最后返回的值。有点绕,大家可以去实践一下。

接下来又要变形了.哈哈

 1 public class Problem {
 2     public static void main(String[] args) {
 3         System.out.println(practiceThree().num);
 4     }
 5     
 6     public static Example practiceThree(){
 7             Example e=new Example();
 8             try {
 9                 e.num=10;
10                 return e;
11             }finally{
12                 e.num=20;
13             }
14         
15     }
16 }
17 class Example{
18     public Example(){
19         
20     };
21     int num;
22 }

这里输出的结果是:20。其实就像上面强调的一样,封存的是内存地址。我改变了这个对象的某一个属性值,并没有改变所引用的对象,所以finally会影响最后的结果。

 

posted @ 2017-07-03 20:41  我为自己找借口  阅读(278)  评论(0编辑  收藏  举报