【发布时间】:2014-02-28 14:11:24
【问题描述】:
我刚刚在我们的一个 Java 库中遇到了一个隐藏的宝石:
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;
}
}
}
我知道finally 胜过一切,但我想知道两件事:
- 当
catch子句执行 时会发生什么?异常是否被抛出?首先会发生什么:抛出的异常还是continue语句? - 如何重写此代码以消除警告?
我找到了this very similar question,但接受的答案只是指出突然会抛出异常,我不确定这意味着什么。另外,它并不能真正帮助我理解我上面关于将要发生的事件顺序的第一个问题。
【问题讨论】:
-
“胜过一切”是什么意思?
-
这是stackoverflow.com/questions/5126455/… 的副本,它确实很好地回答了这个问题(阅读解释)。基本上例外是被回报吞没。基本上使投掷无用。
-
最后块应该做清理任务之类的结束。它不应该做除此之外的其他事情。如果您删除 continue 语句,它将不会显示警告。
-
2.如果
continue;是finally块中的唯一语句,只需将其移出try/catch并删除finally -
这是另一个类似的 SO 问题,有很多解释:stackoverflow.com/questions/65035/…
标签: java exception compiler-warnings throw try-catch-finally