Как в Java гарантировать выполнение блока кода, независимо от возникновения исключения?

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

Ответ

Для этого используется блок finally. Код внутри finally выполнится всегда, независимо от того:

  • Был ли выполнен блок try без ошибок.
  • Было ли выброшено и перехвачено (catch) исключение.
  • Было ли выброшено и НЕ перехвачено исключение (после выполнения finally исключение продолжит распространение).

Пример 1: Выполнение кода после успешной операции

try {
    System.out.println("Выполняем основную логику...");
    // Код без ошибок
} finally {
    System.out.println("Этот блок выполнится ВСЕГДА (даже если try прошёл успешно).");
}

Пример 2: Выполнение кода после перехваченного исключения

try {
    int result = 10 / 0; // ArithmeticException
} catch (ArithmeticException e) {
    System.out.println("Перехватили ошибку: " + e.getMessage());
} finally {
    System.out.println("Этот блок выполнится ВСЕГДА (после catch).");
}

Пример 3: Выполнение кода перед неперехваченным исключением

try {
    throw new RuntimeException("Критическая ошибка!");
} finally {
    // Этот код выполнится ПЕРЕД тем, как исключение "вылетит" из метода.
    System.out.println("Освобождаем ресурсы перед завершением.");
}
// Сюда управление не перейдёт

Типичное использование finally: закрытие файловых потоков (FileInputStream), сетевых соединений, освобождение прочих внешних ресурсов (например, с помощью try-with-resources).