Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Исключения
Раздел: Ловля и Обработка Исключений
Наконец Блок
Домашняя страница > Существенные Классы > Исключения

Наконец Блок

finally блок всегда выполняется когда try блочные выходы. Это гарантирует что finally блок выполняется, даже если происходит неожиданное исключение. Но finally полезно для больше чем только обработки исключений — она позволяет программисту избегать иметь код уборки, случайно обошедший a return, continue, или break. Помещение уборки кодирует в a finally блок всегда является хорошей практикой, даже когда никакие исключения не ожидаются.


Отметьте: Если JVM выходит в то время как try или catch код выполняется, тогда finally блок, возможно, не выполняется. Аналогично, если поток, выполняющийся try или catch код прерывается или уничтожается, finally блок, возможно, не выполняется даже при том, что приложение в целом продолжается.

try блок writeList метод, с которым Вы работали здесь, открывает a PrintWriter. Программа должна закрыть тот поток прежде, чем выйти writeList метод. Это излагает несколько сложную проблему потому что writeList's try блок может выйти одним из трех способов.

  1. new FileWriter оператор приводит к сбою и бросает IOException.
  2. vector.elementAt(i) оператор приводит к сбою и бросает ArrayIndexOutOfBoundsException.
  3. Все успешно выполняется и try блокируйте выходы обычно.

Система времени выполнения всегда выполняет операторы в пределах finally блок независимо от того, что происходит в пределах try блок. Таким образом, это - совершенное место, чтобы выполнить уборку.

Следующий finally блок для writeList метод очищает и затем закрывается PrintWriter.

finally {
    if (out != null) { 
        System.out.println("Closing PrintWriter");
        out.close(); 
    } else { 
        System.out.println("PrintWriter not open");
    } 
} 

В writeList пример, Вы могли предусмотреть уборку без вмешательства a finally блок. Например, Вы могли поместить код, чтобы закрыться PrintWriter в конце try блок и снова в пределах обработчика исключений для ArrayIndexOutOfBoundsException, следующим образом.

try {
    
    // Don't do this; it duplicates code. 
    out.close();
    
} catch (FileNotFoundException e) {
    // Don't do this; it duplicates code.
    out.close();

    System.err.println("Caught FileNotFoundException: " + e.getMessage());
    throw new RuntimeException(e);
    
} catch (IOException e) {
    System.err.println("Caught IOException: " + e.getMessage());
}

Однако, это копирует код, таким образом делая код, трудный читать и подверженный ошибкам, должен Вы изменять его позже. Например, если Вы добавляете код, который может бросить новый тип исключения к try блок, необходимо не забыть закрываться PrintWriter в пределах нового обработчика исключений.


Важный: finally блок является ключевым инструментом для того, чтобы предотвратить утечки ресурсов. Закрывая файл или иначе восстанавливая ресурсы, поместите код в a finally блок, чтобы гарантировать, что ресурс всегда восстанавливается.

Если Вы используете Java SE 7 или позже, рассматриваете использование try-оператор с ресурсами в этих ситуациях, который автоматически выпускает системные ресурсы когда больше не необходимый. У следующего раздела есть больше информации.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Блоки выгоды
Следующая страница: Оператор попытки с ресурсами