多次返回:哪一个设置最终返回值?
给定此代码:
String test() {
try {
return "1";
} finally {
return "2";
}
}
语言规范是否定义了调用的返回值?换句话说:在每个JVM中总是一样的吗?test()
在 Sun JVM 中,返回值为 ,但我想确定,这不是依赖于 VM 的。2
给定此代码:
String test() {
try {
return "1";
} finally {
return "2";
}
}
语言规范是否定义了调用的返回值?换句话说:在每个JVM中总是一样的吗?test()
在 Sun JVM 中,返回值为 ,但我想确定,这不是依赖于 VM 的。2
是的,语言规范定义了“2”是结果。如果 VM 以不同的方式执行,则它不符合规范。
大多数编译器会抱怨它。例如,Eclipse会声称返回块永远不会被执行,但这是错误的。
写这样的代码是非常糟糕的做法,永远不要这样做:)
是的,Java语言规范在这个问题上非常明确(14.20.2):
具有 finally 块的 try 语句通过首先执行 try 块来执行。然后有一个选择:
- 如果尝试块的执行正常完成,[...]
- 如果由于抛出值 V 而突然完成 try 块的执行,则 [...]
- 如果由于任何其他原因R突然完成 try 块的执行,则执行最终块。然后有一个选择:
- 如果最终块正常完成,[...]
- 如果最终的块由于原因 S 而突然完成,则 try 语句由于原因 S 而突然完成(并且原因 R 被丢弃)。