考虑到这一点的代码,我可以绝对肯定的是,finally块总是执行,不管something()是什么?
try {
something();
return success;
}
catch (Exception e) {
return failure;
}
finally {
System.out.println("I don't know if this will get printed out");
}
Run Code Online (Sandbox Code Playgroud) 在Java中,try {...} finally {...}对我来说有些不直观.如另一个问题所示,最终总是在Java中执行吗?,如果try块中有return语句,则在定义finally块时将忽略它.例如,功能
boolean test () {
try {
return true;
}
finally {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
总是会返回false.我的问题:这是为什么?这个由Java做出的设计决策背后有一个特定的哲学吗?我很感激任何见解,谢谢.
编辑:我特别感兴趣的是'为什么'Java认为可以违反我定义的语义.如果我在try块中'返回',那么该方法应该在那里返回.但是JVM决定忽略我的指令并从一个实际尚未到达的子程序返回.
我刚刚在我们的一个Java库中遇到了一个隐藏的gem:
for(Widget w : widgets) {
if(shouldDoStuff()) {
try{
// Do stuff to w.
} catch(Exception e){
throw new RuntimeException("Couldn't do stuff.");
} finally{
// Compiler warning: finally block does not complete normally
continue;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这finally胜过一切,但我想知道两件事:
catch条款不执行呢?异常是否被抛出?首先发生什么:抛出的异常或continue声明?我发现了这个非常相似的问题,但是接受的答案只是声明异常将被突然抛出,我不确定这意味着什么.另外,它并没有真正帮助我理解我上面提到的关于将要发生的事件顺序的第一个问题.