5.4 Ключевое слово 'finally'
Иногда могут быть коды очистки, которые должны обязательно выполняться. Однако, всякий раз, когда происходит исключение, программа резко останавливается, и очищающийся код никогда не выполняется. Чтобы бороться с этим в Java реализуется блок
'finally'. Блок
finally' гарантирует, что он позаботится о всей работе очистки, когда произойдёт исключение. Он используется вместе с блоком try. Блок
'finally' содержит утверждения либо возвратить ресурсы в систему либо напечатать сообщение.
Рассмотрим следующий фрагмент кода.
. . .
try {
doSomethingThatMightThrowAnException();
}
catch ( Exception e) {
. . .
}
finally {
cleanup();
}
. . .
Если метод 'doSomethingThatMightThrowAnException ()' выбрасывает исключение, то будет вызываться метод 'cleanup ()'. Даже если исключение не выброшено, метод 'cleanup ()' в блоке finally будет выполнен. Блок
'finally' является дополнительным. Этот блок помещается после последнего блока 'catch'. Управление обычно передаётся в блок
'finally' в любом случае.
Обратите внимание: Блок 'finally' гарантирует, выполнится ли или нет происходящее исключение. Пункт finally из блока try-catch будет всегда выполняться, независимо от состояния блока try-catch.
Рисунок 5.3 показывает потока блоков try, catch и finally.
Рисунок 5.3: Поток выполнения блоков try, catch и finally
Обратите внимание: Блок finally должен быть всегда связан с блоком try и не может существовать самостоятельно.
Код продемонстрированный в примере 2 показывает использование блока
'finally'. Здесь, блок
'finally' выполнен независимо от того, происходит ли исключение 'ArithmeticException' или нет.
Пример 2:
class FinallyDemo { String name; int nol,no2;
FinallyDemo(String args[]) {
try {
name = new String ( Aptech Limited );
nol = Integer.parselnt(args[0]);
no2 = Integer.parselnt(args[1] ) ;
System.out.println(name);
System.out.println( Division Result is +no1/no2);
}
catch(ArithmeticException i) {
System.out.println( Cannot Divide by zero );
}
finally {
name = null; // clean up code
System.out.println( Finally executed );
}
}
public static void main(String args []) {
new FinallyDemo(args);
}
}
Рисунок 5.4 показывает вывод вышеупомянутого кода.
Рисунок 5.4 а: Вывод примера 2 (когда никакое исключение не выброшено)
Рисунок 5.4 b: Вывод примера 2 (когда исключение выброшено)
Рассмотрим другой пример.
Пример 3:
class DemonstrateException { static String s;
public static void main(String s[]) {
try{
System.out.println( A );
DemonstrateException.staticMethod();
System.out.println( В );
}
catch(NullPointerException ne) {
System.out.println( Exception occured };
System.out.println( С );
}
finally {
System.out.println( D );
}
}
static void staticMethod() {
System.out.println(s.length());
}
}
Вывод показан на рисунке 5.5
Рисунок 5.5: Вывод примера 3