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会影响最后的结果。