我在Java语言规范中发现的内容至少定义了您的代码段应返回3。当然,它没有提到JVM应该如何实现这一点,以及人们可以做哪些优化。
14.20.2节定义
如果try块的执行由于其他任何原因R突然完成,则将执行finally块。然后有一个选择:
- 如果finally块正常完成,则try语句由于原因R突然完成。
- 如果finally块由于原因S突然完成,则try语句由于原因S突然完成(并且原因R被丢弃)。
第14章的开头(更确切地说是14.1节)指定了什么是正常的突然完成。例如
return,具有给定值的a是突然完成。
因此,在这种情况下,该
finally块会突然完成(原因:
return具有给定的值),因此
try,由于相同的原因,将突然完成(并返回3)。这是在证实有关return语句段14.17以及
如果对表达式的求值正常完成,产生一个值V,则return语句突然完成,原因是返回值为V的返回值。



