finally语句的执行时刻

以前虽然知道在try finally语句中,即使try块里有return语句,finally语句也会在return语句执行之前执行,却不知道return表达式与finally语句的执行顺序。

public class Test {
    public static int a() {
        int i = 0;

        try {
            i++;
            return ++i;

        } finally {
            i++;
        }
    }

    public static void main(String[] args) {
        System.out.println(a());
    }
}

这个语句的输出是 2 而不是 3
当执行到 return ++i;

jvm是先执行 ++i,把结果 2 存到临时变量,然后在执行finally语句里的 ++i,所以最终的i的值虽然是 i,但方法返回的值却是 2

其实以前的理解没有错,因为 return ++i; 是一个复合语句了,相当于:

    int j = ++i;  
    return j;  

欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。