当前位置:  开发笔记 > 编程语言 > 正文

try/finally没有catch return语句?

如何解决《try/finally没有catchreturn语句?》经验,为你挑选了1个好方法。

为什么以下代码的结果是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块中返回的值的原因.



1> SomeJavaGuy..:

见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块中返回的值的原因.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有