Для чего в Java используется блок `finally`?

«Для чего в Java используется блок `finally`?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основное назначение — освобождение ресурсов (закрытие файлов, сетевых соединений, транзакций БД), чтобы избежать утечек.

Поведение:

  • Если исключение не возникло — выполняется блок try, затем finally.
  • Если исключение возникло и перехвачено — выполняется блок try, затем catch, затем finally.
  • Если исключение возникло и не перехвачено — выполняется блок try, затем finally, и только после этого исключение передается выше.
  • Блок finally выполняется даже при использовании return, break или continue внутри try или catch.

Классический пример (до Java 7):

FileInputStream fis = null;
try {
    fis = new FileInputStream("file.txt");
    // Чтение данных из файла
} catch (IOException e) {
    System.err.println("Ошибка чтения файла: " + e.getMessage());
} finally {
    // Этот код выполнится в любом случае
    if (fis != null) {
        try {
            fis.close(); // Важно: закрыть ресурс
        } catch (IOException e) {
            System.err.println("Ошибка при закрытии файла");
        }
    }
}

Современная альтернатива: В Java 7+ для автоматического управления ресурсами, реализующими интерфейс AutoCloseable, следует использовать try-with-resources, который неявно добавляет блок finally для вызова close().

try (FileInputStream fis = new FileInputStream("file.txt")) {
    // Работа с ресурсом
} catch (IOException e) {
    System.err.println("Произошла ошибка: " + e.getMessage());
}
// Ресурс fis будет автоматически закрыт здесь