首页  >  文章  >  Java  >  为什么Finally 块中的Return 语句会覆盖Try 块的返回值?

为什么Finally 块中的Return 语句会覆盖Try 块的返回值?

Linda Hamilton
Linda Hamilton原创
2024-11-11 02:34:02999浏览

Why Does a Return Statement in a Finally Block Override the Try Block's Return Value?

返回值不变的原因

在 try-finally 语句中,try 块的执行随着 return 语句的执行而结束。此时,该方法返回的变量 s 的值就是执行 return 语句时 s 的值。

尽管 finally 子句稍后修改了 s 的值,但它确实在 return 语句执行后,不要更改方法的返回值。

不可变对象与可变对象

需要注意的是,这种行为适用于直接修改s 本身位于finally 块中。但是,如果 s 引用了可变对象(String 不是),则修改 finally 块中的对象内容将反映在返回值中。

法律规范

Java 语言规范 (JLS) 在第 14.20.2 节中提供了这些操作的详细指南。在本节中,它指出 try 块中的 return 语句构成突然终止。因此,第 14.17 节解释了 return 语句突然结束块执行。

异常处理和 Return 语句

如果 try 块和 finally 块由于 return 突然终止语句,适用 §14.20.2 中的规则:

  • 如果 try 块由于抛出异常以外的原因突然退出,则执行 finally 块。然后,try 语句会因同样的原因突然完成。
  • 如果 finally 块因原因 S 突然退出,则 try 语句会因原因 S 突然完成,并丢弃原始原因。

这些规则的结果是,finally 块中的 return 语句决定整个 try-finally 语句的返回值,从而覆盖 try 块中的返回值。类似的现象也发生在 try-catch-finally 语句中,其中 try 块中抛出异常并由 catch 块处理,并且 catch 和 finally 块都包含 return 语句。

以上是为什么Finally 块中的Return 语句会覆盖Try 块的返回值?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn