Обрабатывает ли блок finally исключения в Java?

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

Ответ

Нет, блок finally не обрабатывает исключения. Его основная задача — гарантировать выполнение кода (например, для освобождения ресурсов) независимо от того, было ли выброшено исключение в блоке try или нет.

Порядок выполнения:

  1. Выполняется блок try.
  2. Если возникло исключение — выполняется соответствующий блок catch.
  3. Всегда, после try или catch, выполняется блок finally.

Важное предупреждение: Если исключение выбрасывается и в try/catch, и в finally, то исключение из finally «затенит» (suppress) исходное, если оно не обработано особым образом (через addSuppressed).

Пример:

try {
    System.out.println("Внутри try");
    throw new RuntimeException("Ошибка из try");
} catch (RuntimeException e) {
    System.out.println("Поймано: " + e.getMessage());
    // Обработка исключения происходит ЗДЕСЬ, а не в finally
} finally {
    System.out.println("Этот код выполнится ВСЕГДА");
    // Исключение здесь прервёт выполнение и может скрыть исходное
}

Вывод:

Внутри try
Поймано: Ошибка из try
Этот код выполнится ВСЕГДА