我有一个简单的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块中覆盖,而是控制打印输出?
在try与所述的执行块完成return语句和的值s在时间return语句执行是由该方法返回的值。finally子句稍后s(在return语句完成之后)更改值的事实(此时)并未更改返回值。
try
return
s
请注意,以上内容处理的s是对finally块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不是),并且该对象的内容在finally块中已更改,则这些更改将在返回值中看到。
finally
有关所有操作方式的详细规则,请参见Java语言规范的14.20.2节。请注意,执行一条return语句就算是该try块的突然终止(适用于“ 如果try块的执行由于任何其他原因而突然完成的部分,R .... ” 开头)。有关为什么语句突然终止块的信息,请参见JLS的14.17节return。
Java
进一步详细说明:如果语句的try块和语句finally块都try-finally由于return语句而突然终止,则适用第14.20.2节中的以下规则:
如果try由于任何其他原因R [除了引发异常]突然突然完成了该finally块的执行,则将执行该块,然后可以选择:
try-finally
try-catch-finally
catch