关于try,finally里面的return,到底谁先执行的问题

      在JAVA语言的异常处理中,finally里面代码块是为了保证无论出现了什么样的情况,finally里的代码一定会被执行。但是return 的意思就是结束当前函数的调用并跳出这个函数,因此finally块里面的代码也是在return前执行,如果try finally里都有return,那么 finally中的return将覆盖其他地方的return.代码如下:

class FinallyTest
{
  public int method1()
  {
    try {
      return 2;
    }
    catch(Exception e) {return 3;}
  }


  public int method2()
  {
    try {
      return 3;                                               //1
    }
    finally {                                                 //2
      return 4;
    }
  }


  public static void main(String args[])
  {
    FinallyTest ft = new FinallyTest();
    System.out.println("method1 returns " + ft.method1());    //3
    System.out.println("method2 returns " + ft.method2());    //4
  }
}
运行结果是:method1 returns 2
                      method2 returns 4

      下面步入正题:如果try里面有return,是先执行return 还是先执行finally,

这个问题我问过很多人,也得到了很多答案

以下是讨论过程:

肖:

 其实应该还是之前的,虽说是保存了返回的代码,但也是保存,还没返回,执行完finally才把之前保存的掉出来,总觉得中间怪怪的,
 网上的说法,不是先执行,是先保存起来,然后执行finally,然后再执行return

陈:
 在java的语言规范有讲到,如果在try语句里有return语句,finally语句还是会执行。它会在把控制权转移到该方法的调用者或者构造器前执行finally语句。也就是说,使用return语句把控制权转移给其他的方法前会执行finally语句。


郭:

 刚刚那道题finally里的return也会执行,只不过改变不了返回值,还是返回try里面的return的值

《practical java》讲过这个问题,有兴趣可以看看
下面贴我自己的部分代码:
public class ReturnTest {
    public static void main(String args[]){
        int a = test();
        System.out.print(a);
    }
    static int test() {
        int x = 1;
        try {
            return  ++x ;
        } finally {
            if (x > 1) {
                x += 10;
            }
        }
    }
}


运行结果:x=:2
由此可见,在运行finally之前,x就已经等于2,但是控制台里finally里面的x=:先执行,再执行的return 2,且x+=10这句话根本没对return的值造成影响,再综合以上朋友说的,我觉得可以总结为:
       运行时,在try中,要返回的结果已经准备好了,就在这个时候,程序跳到了finally,这个时候结果已经放到了x的局部表量中,执行完finally后,再取出结果,finally对x进行了改变,但不会影响返回的结果。


你可能感兴趣的:(关于try,finally里面的return,到底谁先执行的问题)