Java try-finally返回设计问题

Tra*_*ebb 38 java

在Java中,try {...} finally {...}对我来说有些不直观.如另一个问题所示,最终总是在Java中执行吗?,如果try块中有return语句,则在定义finally块时将忽略它.例如,功能

boolean test () {
    try {
        return true;
    }
    finally {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

总是会返回false.我的问题:这是为什么?这个由Java做出的设计决策背后有一个特定的哲学吗?我很感激任何见解,谢谢.

编辑:我特别感兴趣的是'为什么'Java认为可以违反我定义的语义.如果我在try块中'返回',那么该方法应该在那里返回.但是JVM决定忽略我的指令并从一个实际尚未到达的子程序返回.

And*_*yle 37

从技术上讲,return如果定义finally块,则不会忽略try块中的,只有当finally块也包含a时.return

这是一个可疑的设计决策,回想起来可能是一个错误(很像默认情况下引用是可空/可变的,并且根据一些情况,检查异常).在许多方面,这种行为与对口语的口语理解完全一致finally- "无论事先在try块中发生什么,总是运行此代码." 因此,如果你return true从一个finally区块,总体效果必须始终是返回true,不是吗?

一般来说,这很少是一个很好的习惯用法,你应该finally自由地使用块来清理/关闭资源,但很少从它们返回一个值.

  • 正如我所看到的,如果你在finally块中有一个return语句,Java甚至会警告你.至少Eclipse告诉我"finally块没有正常完成".正如Andrzej所说,最后一块是为了关闭资源. (4认同)