Java:终于如何抛出特朗普?

Adj*_*ion 2 java exception throw compiler-warnings try-catch-finally

我刚刚在我们的一个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胜过一切,但我想知道两件事:

  1. 当发生什么catch条款执行呢?异常是否被抛出?首先发生什么:抛出的异常或continue声明?
  2. 我怎样才能重写这个以消除警告?

我发现了这个非常相似的问题,但是接受的答案只是声明异常将被突然抛出,我不确定这意味着什么.另外,它并没有真正帮助我理解我上面提到的关于将要发生的事件顺序的第一个问题.

Nic*_*oux 5

抛出RuntimeException之后,在堆栈中的另一个catch upper处理它之前,将执行"finally".

正如你最后只是继续,实际上它什么都不做.

矛盾是在结束循环的捕获和继续之间.

一种方法可能是:

boolean exceptionOccured = false;
for(Widget w : widgets) {
    if(shouldDoStuff()) {
        try {
            // Do stuff to w.
        } catch(Exception e){
            exceptionOccured = true;  // do not throw yet.
            e.printStackTrace();
        }
    }
}
if (exceptionOccured) {
  throw new RuntimeException("Couldn't do stuff.");
}
Run Code Online (Sandbox Code Playgroud)

这种方法的主要问题是你不知道出了什么问题.