Я только что наткнулся на скрытую жемчужину в одной из наших библиотек 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
превосходит все, но меня интересуют 2 вещи:
- Что происходит, когда предложение
catch
действительно выполняется? Выбрасывается ли исключение или нет? Что происходит первым: выброшенное исключение или инструкцияcontinue
? - Как я могу переписать это, чтобы избавиться от предупреждения?
Я нашел этот очень похожий вопрос, но в принятом ответе просто говорится, что исключение будет выдано внезапно, и я не уверен, что это значит. Кроме того, это не очень помогает мне понять мой первый вопрос выше о порядке событий, которые произойдут.
continue;
является единственным оператором в блокеfinally
, просто переместите его изtry/catch
и отбросьтеfinally
- person fge   schedule 28.02.2014