Для чего предназначен блок `finally` в Java?

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

Ответ

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

  • Выполнился ли блок try без исключений.
  • Было ли выброшено и обработано исключение в catch.
  • Было ли выброшено необработанное исключение.
  • Был ли использован return, break или continue внутри try или catch.

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

Пример (Java до версии 7):

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

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

try (FileInputStream fis = new FileInputStream("data.txt");
     BufferedInputStream bis = new BufferedInputStream(fis)) {
    // Работа с ресурсами
} catch (IOException e) {
    // Обработка исключения
} // Ресурсы закрываются автоматически, блок finally не нужен

Блок finally остаётся полезным для любой другой «финализирующей» логики, не связанной с AutoCloseable.