try-catch的return暂存区:梳理工作流程

24 阅读2分钟

代码分析

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
        }
    }
}

详细执行过程

  1. 初始化变量:

    • test() 方法中,int temp = 1; 初始化 temp 变量为 1。
  2. 进入 try:

    • System.out.println(temp); 会输出当前 temp 的值,temp 目前是 1,因此会打印出 1
    • 接下来执行 return ++temp;,这里 ++temp 会先将 temp 增加到 2,然后 return 会返回这个新的值 2。
  3. 进入 finally:

    • return 语句执行之后,finally 块总是会执行,即使有 return 语句。此时 finally 块中的代码会先执行。
    • ++temp;temp 增加到 3。
    • 然后 System.out.println(temp); 打印 temp 的值,此时 temp 为 3,因此会打印出 3
  4. return 的行为:

    • 虽然 finally 中已经修改了 temp 的值,但**return 语句会在 finally 执行完后,返回最初 try 块中指定的值**。也就是说,return ++temp; 返回的是 temptry 块中被修改后的值(即 2),而不是在 finally 块中的值(即 3)。
  5. 返回值:

    • 最后,test() 方法返回的值是 2,这个值被传递给 System.out.println(test());,因此最终会打印 2

输出顺序和最终结果

根据上面的执行顺序,输出将会是:

1  // 在 try 块中打印 temp 的值 1
3  // 在 finally 块中打印 temp 的值 3(已被修改)
2  // 返回的值 2,从 try 块返回

总结

  1. try 块中的 return 语句会被执行,但 finally 块总会在 try 块执行完后执行,并且 finally 中的修改对返回值没有影响。
  2. finally 中的修改对返回值是不可见的,return 语句返回的是 try 块中的值。
  3. finally 无论是否发生异常都会执行,并且如果 finally 中也有 return 语句,finally 中的 return 会覆盖 trycatch 中的 return,但在本例中 finally 仅修改了 temp,没有改变 return 的返回值。