为什么在finally块中更改返回的变量不会更改返回值?

德文德拉:

我有一个简单的Java类,如下所示:

public class Test {

    private String s;

    public String foo() {
        try {
            s = "dev";
            return s;
        } 
        finally {
            s = "override variable s";
            System.out.println("Entry in finally Block");  
        }
    }

    public static void main(String[] xyz) {
        Test obj = new Test();
        System.out.println(obj.foo());
    }
}

这段代码的输出是这样的:

Entry in finally Block
dev  

为什么s不在finally块中覆盖,而是控制打印输出?

泰德·霍普(Ted Hopp):

try与所述的执行块完成return语句和的值s在时间return语句执行是由该方法返回的值。finally子句稍后s(在return语句完成之后)更改值的事实(此时)并未更改返回值。

请注意,以上内容处理的s是对finally自身值的更改,而不是对s引用对象的更改如果s是对可变对象的引用(String不是),并且该对象内容finally块中已更改,则这些更改将在返回值中看到。

有关所有操作方式的详细规则,请参见Java语言规范的14.20.2节请注意,执行一条return语句就算是该try的突然终止(适用于“ 如果try块的执行由于任何其他原因而突然完成的部分,则R .... ”)。有关为什么语句突然终止块的信息,请参见JLS的14.17节return

更详细地讲:如果语句try块和语句finally块都try-finally由于return语句而突然终止,则适用第14.20.2节中的以下规则:

如果try由于任何其他原因R [除了引发异常]突然突然完成了该finally块的执行,则将执行块,然后可以选择:

  • 如果该finally块正常完成,则该try语句由于原因R突然完成。
  • 如果该finally块由于原因S突然完成,则该try语句由于原因S突然完成(并且原因R被丢弃)。

结果是,中的return语句finally确定了整个try-finally语句的返回值,而该try的返回值被丢弃。try-catch-finally如果该try块引发异常,它被一个catch捕获,并且该catch块和该finally块都具有return语句,则语句中也会发生类似的事情

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章