Finally 块对返回值的影响
在 Java 中,finally 块对方法返回值的行为可能是违反直觉的。让我们分析一段代码片段,深入探究造成这种现象的根本原因。
考虑以下代码:
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 infinallyBlock”,但返回“开发。”这是因为返回值是由try块中return语句的执行决定的。 finally 块中对 's' 所做的更改发生在 try 块完成之后,因此不会反映在返回值中。
需要注意的是,这适用于 's' 值的更改本身,而不是对象引用的更改。如果 's' 是对可变对象的引用,并且其内容在 finally 块中更改,则这些更改将在返回值中可见。
Java 语言规范 (JLS) 概述了此操作的详细规则第 14.20.2 节中的行为。对于try-finally语句,如果try块和finally块都有return语句,则以finally块的返回值为准。这是因为 return 语句的执行被视为块的突然终止。
总而言之,方法的返回值由 try 块中的 return 语句确定。对finally 块中的变量所做的更改,无论是值还是通过对象修改,都不会影响返回值,除非finally 块还包含return 语句。
以上是Final 块如何影响 Java 中方法的返回值?的详细内容。更多信息请关注PHP中文网其他相关文章!