try/finally中,出现return后函数并不立刻返回,而是将返回结果放入函数栈中,执行finally后再真正返回
举三个例子
例1
public class Main {
static int test() {
int i = 3;
try {
System.out.println("i in try:" + i);
return i;
} finally {
i = 5;
System.out.println("i in finally:" + i);
}
}
public static void main(String args[]) {
System.out.println("i in main:" + new Main().test());
}
}
执行流程:
1.执行try中的println,输出当前i的值为3
2.执行到return i时,将当前i的值压入函数栈中(此时i为3)
3.执行finally,虽然finally中对i的值进行了修改,从println中也可以看出i的值确实被改为了5,然而i在压入栈时的值为3,故程序最终的返回值仍为3
程序输出:
i in try:3
i in finally:5
i in main:3
例2
public class Main {
static int test() {
try {
return 1;
} finally {
return 2;
}
}
public static void main(String args[]) {
System.out.println("return of test:" + new Main().test());
}
}
执行流程:
1.执行try中的return 1,将1压入函数栈
2.继续执行到finally,由于finally中执行了return 2,将函数栈的的返回值更新为2
3.finally执行完后返回,因此最终返回值为2
程序输出:
return of test:2
例3
public class Main {
static int test() {
try {
return fun1();
} finally {
return fun2();
}
}
static int fun1() {
System.out.println("fun1()");
return 1;
}
static int fun2() {
System.out.println("fun2()");
return 2;
}
public static void main(String args[]) {
System.out.println("return of test:" + new Main().test());
}
}
程序输出:
fun1()
fun2()
return of test:2