太费解了. 太费解了.java题.为什么结果不同?
final block 中的内容永远会执行,唯一绕过它的方法也许是 System.exit() 。为了验证这一点,你可以你在++x;
后面加上
System.out.println(x);
,然后运行,会发现 test 方法将会在返回 1 之前输出 2 。所以就不难理解为什么 get 方法会输出 2 了,因为在返回 1 之前,Java 先去执行了 finally block 。既然 finally block 有个 return,try block 里面的 return 就被忽略了。Java 的设计机制就是这样,finally 存在的意义就是收拾烂摊子,所以无论如何都要执行。详见[1]。
注意在 finally block 中写 return 是非常非常坏的事情,因为一切异常都会因此而忽略掉。
[1] http://docs.oracle.com/javase/specs/jls/se5.0/html/statements.html#14.20.2
原发布于 https://www.zhihu.com/question/20122686/answer/14048026