我们都知道,finally语句是一定会执行的,同样return语句也标志着退出当前方法,那么他们两个一起出现会产生怎么样的情况呢?
废话少说,上代码:
首先的一个例子,我们先检测一下,两个块中都含有return语句会怎么样
static int i = 1;
static int try_finally() {
try {
return i;
} finally {
i += 1;
return i;
}
}
public static void main(String[] args) {
System.out.println(try_finally());
}
结果打印了2,说明即使有return,finally中的语句也得到了执行。
第二个例子,try里面有return,finally没有return,会怎样?
static int i = 1; static int try_finally() { try { return i; } finally { System.out.println("finally"); } } public static void main(String[] args) { System.out.println(try_finally()); }
结果打印了finally和1,这说明finally语句即使在try中有return的情况下,仍然能得到执行
那么问题来了,这两个块究竟是什么样的执行顺序,究竟是程序跳过了try中的return直接先去执行finally,然后再回去执行return?还是将return的结果暂存一下再去执行finally?
测试代码三,
static int i = 1; static int try_finally() { try { return i; } finally { i += 1; } } public static void main(String[] args) { System.out.println(try_finally()); }
结果打印了1
这就说明,程序在执行到try中的return后,将这个return的值暂存在函数栈中,再去执行finally,如果finally中也有一个return,就像例1,那就直接返回finally中的这个return值,函数栈中的就不要了,如果finally中没有出现return,那就返回之前暂存的值。