一尘不染

Java尝试最终返回设计问题

java

在Java中,尝试{…}最终{…}在我看来有点不直观。如另一个问题所示,“最终是否总是在Java中执行?,如果try块中有return语句,则在定义了finally块的情况下将忽略该语句。例如功能

boolean test () {
    try {
        return true;
    }
    finally {
        return false;
    }
}

将始终返回false。我的问题:这是为什么?Java做出的这种设计决策背后是否有特定的哲学?我感谢任何见解,谢谢。

编辑:我对“为什么” Java认为可以违反我定义的语义特别感兴趣。如果我在try块中“返回”,则该方法应立即返回。但是JVM决定忽略我的指令,并从实际上
尚未 到达的子例程返回。


阅读 252

收藏
2020-09-08

共1个答案

一尘不染

从技术上讲,return如果 定义 了一个finally块,则try块中的the不会被忽略,只有在该finally块中也包含一个。
__return

这是一个可疑的设计决策,回顾起来 可能是
一个错误(很像引用默认为可为空/可变,并且根据某些情况是经过检查的异常)。在许多方面,此行为与口语上对什么finally意思的理解完全一致-“无论try块中事先发生了什么,请始终运行此代码”。因此,如果您return true从一个finally障碍开始,总的效果必须总是要返回true,不是吗?

通常,这很少是一个好习惯,您应该finally自由地使用块来清理/关闭资源,但是很少从它们返回值。

2020-09-08