Исключение приводит к тому, что выполнение достигает оператора catch
, поэтому возвращается 2
.
Он связан с операцией close()
, которая обязательно вызывается в операторе try-with-resources
, прежде чем разрешить методу возврат.
Я не нашел конкретной части JLS, в которой указан случай с возвратом.
Таким образом, вы должны учитывать, что общее объяснение применимо:
14.20.3. примерочных с-ресурсов
...
Если все ресурсы успешно инициализируются, блок try выполняется как
нормальный, а затем все ненулевые ресурсы попробовать с ресурсами
Заявление закрыто.
Обратите внимание, что без try-with-resources
вы, вероятно, напишите этот код:
try(Foo foo = new Foo()){
return 1;
}
catch (RuntimeException e){
//handle exception without throwing
}
return 2;
таким образом:
try{
Foo foo = new Foo();
foo.close(); // handled automatically by try-with-resources
return 1;
}
catch (RuntimeException e){
//handle exception without throwing
}
return 2;
Так что должно иметь смысл, почему 1
не может быть возвращено.
Обратите внимание, что код, сгенерированный компилятором try-with-resources
, намного длиннее и сложнее, чем псевдоэквивалентность, которую я предоставил из-за исключенных исключений. Но это не ваш вопрос, поэтому позвольте мне поддержать эту точку зрения.