Философия Java


Выполнение очистки с помощью finally


Часто есть такие места кода, которые вы хотите выполнить независимо от того, было ли выброшено исключение в блоке 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 выполняется всегда.




Начало  Назад  Вперед