@iskateli

Всегда ли выполняется выполняется блок finally?

Брюс Эккель в "Философия Java" пишет на стр. 388 что
блок finally выполняется всегда

но на на стр. 400 прямо противоположное утверждение, что он может и не выполнятся
в случае неудачи при конструировании блок finally не выполняется

контекст из книги для второго утверждения с примером кода:
//: exceptions/Cleanup.java
// Гарантированное освобождение ресурса
public class Cleanup {
public static void main(String[] args) {
  try {
     lnputFile in = new InputFile("Cleanup.java")j
     try {
       String s;
       int i = 1;
       while((s = in.getLine()) != null)
             ; // Обработка данных по строкам...
  } catch(Exception e) {
     System.0ut.println("Перехвачено исключение Exception в main");
     e .printStackTrace(System.out);
  } finally {
     in.dispose();
  }
} catch(Exception e) {
  System.out.println("Ошибка при конструировании InputFile");
}
}
} /* Output:
dispose() успешен
*///:~

Присмотритесь повнимательнее к логике происходящего: объект lnputFile фактически
конструируется в собственном блоке try. Если при конструировании произойдет ошиб­
ка, программа входит во внешний блок catch, а метод dispose() не вызывается. Но если
конструирование проходит успешно, необходимо проследить за тем, чтобы с объектом
были выполнены завершающие действия, поэтому сразу же после конструирования
создается новый блок try. Блок finally, выполняющий завершающие действия, свя­зан с внутренним блоком try; в случае неудачи при конструировании блок finally не выполняется, но он всегда будет выполнен в случае успешного конструирования
  • Вопрос задан
  • 721 просмотр
Решения вопроса 1
Vamp
@Vamp
Автор правильно пишет. Если исключение выбросится на строке lnputFile in = new InputFile("Cleanup.java")j, то оно попадёт сразу в catch(Exception e) { System.out.println("Ошибка при конструировании InputFile"); }. Здесь finally не выполняется, так как исполнение кода не заходит в try блок, к которому прикреплён тот finally.

Но если исключение стрельнет где-то внутри цикла while((s = in.getLine()) != null), то сработает внутренний catch блок и finally блок. Внешний catch не будет выполнен.

А если в блоке try либо catch выполнить System.exit() ?

В таком случае finally блок не будет выполнен, так как javadoc System.exit() чётко пишет: "This method never returns normally." А раз метод не возвращает управление, то try блок не выполняется до конца, соответственно finally не запускается.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Maksclub
@Maksclub
maksfedorov.ru
finally всегда выполняется

А зачем вопросы? Я джаву в глаза не видел, но проверить же минутное дело

кейс 1 (исключение перехватывается на том же уровне)

61c3868623248819838555.png

кейс 2 (исключение вылетает на уровень выше)

61c386dd00de0251009782.png
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы