为什么以下代码的结果是3,为什么最终得到终止并退出方法,即使编译器检查首先尝试以及为什么try中的返回不会终止方法?
public int returnVal(){ try{ return 2; } finally{ return 3; } }
SomeJavaGuy.. 5
见JLS 14.17
可以看出,返回语句总是突然完成.
前面的描述说"尝试转移控制"而不仅仅是"转移控制",因为如果在try块或catch子句包含return语句的方法或构造函数中有任何try语句(§14.20),那么那些的最终子句在将控制权转移给方法或构造函数的调用者之前,try语句将按顺序执行,最内层到最外层.突然完成finally子句可以破坏由return语句启动的控制转移.
特别检查短语attempts to transfer control
和最后一句.尝试返回尝试转移控件,最后转发disrupt the transfer of control initiated by a return statement
.
换句话说,try attempts to transfer the controll
,但由于finally块的执行仍然是开放执行并且包含return语句,所以finally块中的controll的尝试传输具有更高的值preceding
.这就是你看到3
在finally块中返回的值的原因.
见JLS 14.17
可以看出,返回语句总是突然完成.
前面的描述说"尝试转移控制"而不仅仅是"转移控制",因为如果在try块或catch子句包含return语句的方法或构造函数中有任何try语句(§14.20),那么那些的最终子句在将控制权转移给方法或构造函数的调用者之前,try语句将按顺序执行,最内层到最外层.突然完成finally子句可以破坏由return语句启动的控制转移.
特别检查短语attempts to transfer control
和最后一句.尝试返回尝试转移控件,最后转发disrupt the transfer of control initiated by a return statement
.
换句话说,try attempts to transfer the controll
,但由于finally块的执行仍然是开放执行并且包含return语句,所以finally块中的controll的尝试传输具有更高的值preceding
.这就是你看到3
在finally块中返回的值的原因.