Всегда ли выполняется выполняется блок 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 не выполняется, но он всегда будет выполнен в случае успешного конструирования
Ответы (1 шт):
Автор решения: Igor
→ Ссылка
в случае неудачи при конструировании блок finally не выполняется
Имеется в виду неудача (Exception) при конструировании на этой строчке:
InputFile in = new InputFile("Cleanup.java");
При возникновении исключения внутри конструктора InputFile выполнение прерывается и пeреходит во внешний catch, а во внутренний try не заходит и в finally не попадает.