代码分析
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
int temp = 1;
try {
System.out.println(temp); // 打印 temp
return ++temp; // 返回 temp 增加后的值
} catch (Exception e) {
System.out.println(temp); // 如果发生异常,则打印 temp
return ++temp; // 返回 temp 增加后的值
} finally {
++temp; // 在 finally 中修改 temp
System.out.println(temp); // 打印 temp
}
}
}
详细执行过程
-
初始化变量:
- 在
test()方法中,int temp = 1;初始化temp变量为 1。
- 在
-
进入
try块:System.out.println(temp);会输出当前temp的值,temp目前是 1,因此会打印出1。- 接下来执行
return ++temp;,这里++temp会先将temp增加到 2,然后return会返回这个新的值 2。
-
进入
finally块:- 在
return语句执行之后,finally块总是会执行,即使有return语句。此时finally块中的代码会先执行。 ++temp;将temp增加到 3。- 然后
System.out.println(temp);打印temp的值,此时temp为 3,因此会打印出3。
- 在
-
return的行为:- 虽然
finally中已经修改了temp的值,但**return语句会在finally执行完后,返回最初try块中指定的值**。也就是说,return ++temp;返回的是temp在try块中被修改后的值(即2),而不是在finally块中的值(即3)。
- 虽然
-
返回值:
- 最后,
test()方法返回的值是2,这个值被传递给System.out.println(test());,因此最终会打印2。
- 最后,
输出顺序和最终结果
根据上面的执行顺序,输出将会是:
1 // 在 try 块中打印 temp 的值 1
3 // 在 finally 块中打印 temp 的值 3(已被修改)
2 // 返回的值 2,从 try 块返回
总结
try块中的return语句会被执行,但finally块总会在try块执行完后执行,并且finally中的修改对返回值没有影响。finally中的修改对返回值是不可见的,return语句返回的是try块中的值。finally无论是否发生异常都会执行,并且如果finally中也有return语句,finally中的return会覆盖try或catch中的return,但在本例中finally仅修改了temp,没有改变return的返回值。