我有一个简单的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
语句完成之后)更改值的事实(此时)并未更改返回值。
请注意,以上内容处理的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] 删除。
我来说两句