多次返回:哪一个设置最终返回值?

2022-08-31 19:48:04

给定此代码:

String test() {
    try {
        return "1";
    } finally {
        return "2";
    }
}

语言规范是否定义了调用的返回值?换句话说:在每个JVM中总是一样的吗?test()

在 Sun JVM 中,返回值为 ,但我想确定,这不是依赖于 VM 的。2


答案 1

是的,语言规范定义了“2”是结果。如果 VM 以不同的方式执行,则它不符合规范。

大多数编译器会抱怨它。例如,Eclipse会声称返回块永远不会被执行,但这是错误的。

写这样的代码是非常糟糕的做法,永远不要这样做:)


答案 2

是的,Java语言规范在这个问题上非常明确(14.20.2):

具有 finally 块的 try 语句通过首先执行 try 块来执行。然后有一个选择:

  • 如果尝试块的执行正常完成,[...]
  • 如果由于抛出值 V 而突然完成 try 块的执行,则 [...]
  • 如果由于任何其他原因R突然完成 try 块的执行,则执行最终块。然后有一个选择:
    • 如果最终块正常完成,[...]
    • 如果最终的块由于原因 S 而突然完成,则 try 语句由于原因 S 而突然完成(并且原因 R 被丢弃)。