Finally的执行时机

时间:2021-11-29 04:30:03

有人问下面代码是return先执行,还是finally先执行.

int i = 1;
try{
    return i;
}finally{
  i = 0;
}

很多人都回答是finally先执行,因为他们知道是返回0.但是其实真正意义上来讲是return先开始执行的,只是return中间会跳转到Finally代码执行,然后再跳转回来。

return的执行 是分两步的 第一步计算return 右边表达式的值,然后进行返回。

Finally 在return的右边表达式计算完毕后执行,当Finally执行完毕后,return正式返回右边表达式的值.
所以我们才称之 “在return语句的中间执行”
在上面例子中,右边表达式简单,但是也要计算的,只是直接得到计算结果而已。然后执行finally,最后返回0.
看看下面的例子,你就明白了。

package test;

public class FinallyTest {
        
public static Container test(){
        Container c = new Container();
        try{
            return print(c);//由于返回的是对象,所以进行对象引用传递.,所以return语句最后就是返回一个执行c对象的引用.
        }finally{
                System.out.println("Finally Executed");
                c.i = 0;
        }
}

public static Container print(Container c){
        System.out.println("Return Executed");
        System.out.println("print i="+c.i);
        return c;
}

public static void main(String[] args){
        System.out.println("main i="+test().i);
}

static class Container{
        public int i = 1;
}

}

输入如下:
Return Executed
print i=1
Finally Executed
main i=0