为什么在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块中覆盖,但是控制打印输出?

回答:

执行return语句时,try块完成,return语句执行时的值为s是该方法返回的值。事实上,finally子句稍后更改sreturn语句完成后)的值不会(此时)更改返回值。
请注意,上述内容涉及finally块中s本身的值的更改,而不涉及s引用的对象。如果s是对可变对象的引用(其String不是),并且对象的contentsfinally块中更改,那么这些更改将在返回值中看到。
Section 14.20.2 of the Java Language Specification可以找到有关所有操作的详细规则。注意,return语句的执行计数为try块的突然终止(应用开始“If execution of the try block completes abruptly for any other reason R….”部分)。参见Section 14.17 of the JLS为什么一个return语句是突然终止块。
通过进一步的细节:如果try块和finally
try-finally语句由于return语句而突然终止,则§14.20.2中的以下规则适用:

如果try块的执行因任何其他原因R [除了抛出异常]突然完成,则执行finally块,然后有一个选择:

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

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why does changing the returned variable in a finally block not change the return value?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 20 = 29