最后尝试-捕捉-执行try-finally块时对控制的理解包含return语句

时间:2019-01-06 19:29:06

标签: java

任何人都可以向我解释所附的代码。该控件将如何从try转移到finally以及没有return语句的情况下final将如何工作。

class TryCatchFinally{

    int ID = 0;

    public Integer test() {
        try {
            return this.ID;
        } finally {
            this.ID = 2;
        }
    }


  public static void main(String ...s) {
   TryCatchFinally obj = new TryCatchFinally();  //line 1
   System.out.println(obj.test()); //line 2
   //line 3
  }
}

实际输出是-    0

在执行test()函数时,我最终将ID的值更改为2。我知道是否在主方法输出的第3行的第obj.ID行写入<?php $string = 'I have string for example ")bla bla(" and I would like to switch between the parentheses with php regex so the output will be "(bla bla)"'; echo preg_replace ( '/\)(.*?)\(/', '($1)', $string ); ?> #3。我想在这里知道,第2行的结果为0。为什么?终于什么时候才真正被叫到这里?

1 个答案:

答案 0 :(得分:5)

确实发生了finally块。来自docs tutorial

  

这确保即使发生意外异常,也会执行finally块。但最后,它不仅对异常处理有用,它还使程序员避免因返回,继续或中断而意外跳过清理代码。

但是在到达finally块之前,结果被“返回”(不退出该方法,但是返回值被临时存储),因此在返回语句时,{{1} }仍为零。

ID

如果在方法之后打印出public Integer test() { try { return this.ID; //Still 0 at time of return } finally { this.ID = 2; //This still gets executed, but after the return value is stored } } 字段:

ID

然后您得到:

TryCatchFinally obj = new TryCatchFinally();  //line 1
System.out.println(obj.test());
System.out.println(obj.ID);