【发布时间】:2011-05-10 06:40:42
【问题描述】:
在 Java 中,try { ... } finally { ... } 的执行对我来说有点不直观。如另一个问题Does finally always execute in Java? 所示,如果try 块中有return 语句,如果定义了finally 块,它将被忽略。比如函数
boolean test () {
try {
return true;
}
finally {
return false;
}
}
将始终返回 false。我的问题:为什么会这样? Java 做出的这个设计决策背后是否有特定的哲学?感谢您的任何见解,谢谢。
编辑:我对“为什么”Java 认为可以违反我定义的语义特别感兴趣。如果我在 try 块中“返回”,则该方法应该立即返回。但是 JVM 决定忽略我的指令并从实际上还没有到达的子程序返回。
【问题讨论】:
-
一个类似的问题或有趣的事情是,如果你有一个没有catch的try-finally,并且你从finally中抛出一个异常,那么原来的异常已经进入了必杀技...... :) 所以永远不会让异常退出 finally 块
-
不,不会的。您的代码无法编译 ;-)
-
@Peter:只是因为他输入了错误的返回类型。
-
@Gábor:您可能应该从 catch 块中抛出异常,并使用“throw new Exception("Message", throwable)”附加捕获的异常,其中 throwable 是捕获的异常。稍后这将为您提供一个很好的堆栈跟踪。但是如果你在 finally 块中抛出异常,这听起来很奇怪,因为这意味着 try 块永远不会成功;-)
-
虽然最终允许“return”语句看起来像是一个设计错误,但这并不意味着“Java 违反了您定义的语义”。规则很简单,finally 块总是得到最后一个单词。它不是“尚未达到的子程序”。那是对finally目的的误解。 finally 之所以被添加到现代语言中,正是因为在旧语言中,无法保证“无论如何”总是会执行某些逻辑。在这种情况下,最终“获胜”是一件好事。将“return false”移到 finally 的末尾。
标签: java