Looking for java Keywords? Try Ask4Keywords

Java Language Утверждения try-finally и try-catch-finally


пример

Команда try...catch...finally объединяет обработку исключений с кодом очистки. Блок finally содержит код, который будет выполняться при любых обстоятельствах. Это делает их подходящими для управления ресурсами и других видов очистки.

Примерка наконец

Вот пример более простой ( try...finally ):

try {
    doSomething();  
} finally {
    cleanUp();
}

Поведение try...finally выглядит следующим образом:

  • Выполняется код в блоке try .
  • Если исключение не было выбрано в блоке try :
    • Выполняется код в блоке finally .
    • Если блок finally генерирует исключение, это исключение распространяется.
    • В противном случае управление переходит к следующему утверждению после try...finally .
  • Если в блоке try было выбрано исключение:
    • Выполняется код в блоке finally .
    • Если блок finally генерирует исключение, это исключение распространяется.
    • В противном случае исходное исключение продолжает распространяться.

Код внутри блока finally всегда будет выполнен. (Единственные исключения - если вызывается System.exit(int) или паника JVM.) Таким образом, finally блок - это правильный код места, который всегда необходимо выполнить; например, закрытие файлов и других ресурсов или освобождение блокировок.

попробуй поймать, наконец,

Наш второй пример показывает, как catch и, finally можно использовать вместе. Это также иллюстрирует, что очистка ресурсов не является простой.

// This code snippet writes the first line of a file to a string
String result = null;
Reader reader = null;
try {
    reader = new BufferedReader(new FileReader(fileName));
    result = reader.readLine();
} catch (IOException ex) {
    Logger.getLogger.warn("Unexpected IO error", ex);  // logging the exception
} finally {
    if (reader != null) {
        try {
            reader.close();
        } catch (IOException ex) {
            // ignore / discard this exception
        }
    }
}

Полный набор (гипотетических) поведений try...catch...finally в этом примере слишком сложно описать здесь. Простая версия заключается в том, что код в блоке finally всегда будет выполняться.

Рассматривая это с точки зрения управления ресурсами:

  • Мы объявляем «ресурс» (т. reader Переменную reader ) перед блоком try чтобы он был доступен для блока finally .
  • Помещая new FileReader(...) , catch может обрабатывать любое исключение IOError из броска при открытии файла.
  • Нам нужен reader.close() в блоке finally потому что есть некоторые пути исключения, которые мы не можем перехватывать ни в блоке try ни в блоке catch .
  • Однако, поскольку исключение могло быть выброшено до того, как был инициализирован reader , нам также понадобится явный критерий null .
  • Наконец, reader.close() может (гипотетически) вызвать исключение. Нас это не волнует, но если мы не поймаем исключение в источнике, нам нужно будет разобраться с ним в стеке вызовов.
Java SE 7

Java 7 и более поздние версии предоставляют альтернативный синтаксис try-with-resources, который значительно упрощает очистку ресурсов.