Часто есть такие места кода, которые вы хотите выполнить независимо от того, было ли выброшено исключение в блоке try, или нет. Это обычно относится к некоторым операциям, отличным от утилизации памяти (так как об этом заботится сборщик мусора). Для достижения этого эффекта вы используете предложение finally [53] в конце списка всех обработчиков исключений. Полная картина секции обработки исключений выглядит так:
try { // Критическая область: Опасная активность,
// при которой могут быть выброшены A, B или C
} catch(A a1) { // Обработчик ситуации A
} catch(B b1) { // Обработчик ситуации B
} catch(C c1) { // Обработчик ситуации C
} finally { // Действия, совершаемые всякий раз
}
Для демонстрации, что предложение finally всегда отрабатывает, попробуйте эту программу:
//: c10:FinallyWorks.java
// Предложение finally выполняется всегда.
class ThreeException extends Exception {}
public class FinallyWorks { static int count = 0; public static void main(String[] args) { while(true) { try { // Пост-инкремент, вначале равен нулю:
if(count++ == 0) throw new ThreeException(); System.out.println("No exception"); } catch(ThreeException e) { System.err.println("ThreeException"); } finally { System.err.println("In finally clause"); if(count == 2) break; // выйти из "while"
} } } } ///:~
Эта программа также дает подсказку, как вы можете поступить с фактом, что исключения в Java (как и исключения в C++) не позволяют вам возвратится обратно в то место, откуда оно выброшено, как обсуждалось ранее. Если вы поместите ваш блок try в цикл, вы сможете создать состояние, которое должно будет встретиться, прежде чем вы продолжите программу. Вы также можете добавить статический счетчик или какое-то другое устройство, позволяющее циклу опробовать различные подходы, прежде чем сдаться. Этим способом вы можете построить лучший уровень живучести вашей программы.
Вот что получается на выводе:
ThreeException In finally clause No exception In finally clause
Независимо от того, было выброшено исключение или не, предложение finally выполняется всегда.