####示例 ####
try、finally中都有return的执行顺序
public class TestReturn {
private static int i = 1;
public static void main(String[] args) {
int i = testRetrun();
System.out.println("Final-i:" + i);
}
private static int testRetrun() {
try {
i++;
System.out.println("try-i:" + i);
return ++i;
} catch (Exception e) {
System.out.println("catch");
} finally {
System.out.println("finally-i:" + i);
i++;
System.out.println("finally-i:" + i);
return ++i;
}
}
}
打印结果
try-i:2
finally-i:3
finally-i:4
Final-i:5
执行顺序
先执行try代码块,return逻辑执行但不返回,接着执行finally语句,return逻辑执行返回。
try、catch中都有return的执行顺序
private static int testRetrun() {
try {
i++;
System.out.println("try-i:" + i);
return ++i;
} catch (Exception e) {
System.out.println("catch-i:" + i);
return ++i;
} finally {
System.out.println("finally-i:" + i);
i++;
System.out.println("finally-i:" + i);
}
}
####打印结果
try-i:2
finally-i:3
finally-i:4
Final-i:3
####执行顺序
先执行try代码块,return逻辑执行但不返回,接着执行finally语句,执行完毕后,再通过try代码块中的return返回。
其他情况都是一样的,这里就不做测试了
结论
- return语句并不是函数的最终出口,如果有finally语句,这在return之后还会执行finally(return的值会暂存在栈里面,等待finally执行后再返回)
- finally永远会执行
- 当finally中有return时,则通过finally中的return结束代码执行
- 当finally中无retrun时,则执行完finally代码块后再通过try或catch中的return结束代码执行