在Java中,尝试{…}最终{…}在我看来有点不直观。如另一个问题所示,“最终是否总是在Java中执行?,如果try块中有return语句,则在定义了finally块的情况下将忽略该语句。例如功能
boolean test () { try { return true; } finally { return false; } }
将始终返回false。我的问题:这是为什么?Java做出的这种设计决策背后是否有特定的哲学?我感谢任何见解,谢谢。
编辑:我对“为什么” Java认为可以违反我定义的语义特别感兴趣。如果我在try块中“返回”,则该方法应立即返回。但是JVM决定忽略我的指令,并从实际上 尚未 到达的子例程返回。
从技术上讲,return如果 定义 了一个finally块,则try块中的the不会被忽略,只有在该finally块中也包含一个。 __return
return
finally
这是一个可疑的设计决策,回顾起来 可能是 一个错误(很像引用默认为可为空/可变,并且根据某些情况是经过检查的异常)。在许多方面,此行为与口语上对什么finally意思的理解完全一致-“无论try块中事先发生了什么,请始终运行此代码”。因此,如果您return true从一个finally障碍开始,总的效果必须总是要返回true,不是吗?
try
return true
通常,这很少是一个好习惯,您应该finally自由地使用块来清理/关闭资源,但是很少从它们返回值。