我刚遇到以下代码:
public class TestFinally {
public static void main(String[] args) {
int returnValue = function();
System.out.println("Return value: " + returnValue);
}
public static int function() {
try {
return 1;
} catch (Exception e){
return 2;
} finally{
return 3;
}
}
}
毫无疑问,运行此代码将产生“返回值:3”的输出。
但是,我很好奇:
非常感谢。
干杯,维尔恩
我在Java语言规范中发现的至少定义了您的代码段应返回3。当然,它没有提到JVM应该如何实现这一点,以及人们可以做哪些可能的优化。
14.20.2节定义
如果try块的执行由于其他任何原因R突然完成,则将执行finally块。然后有一个选择:
- 如果finally块正常完成,则try语句由于原因R突然完成。
- 如果finally块由于原因S突然完成,那么try语句由于原因S突然完成(并且原因R被丢弃了。]]
以及第14章的开头(更确切地说是section 14.1)指定了什么是正常且突然的完成。例如,具有给定值的
return
是突然完成。
因此,在这种情况下,finally
块会突然完成(原因:具有给定值的return
),因此出于相同的原因,try
将突然完成(并返回3)。这也在section 14.17 about the return statement中得到确认
如果表达式的求值正常完成,产生一个值V,则return语句突然完成,原因是返回值为V。
FWIW,我收到功能警告:
实现取决于JVM,并且有许多JVM。您可以深入研究OpenJDK's source code以了解其如何实现finally
,但这不是唯一的方法。就语言而言,重要的是行为。