Ответ
Нет, блок finally не обрабатывает исключения. Его основная задача — гарантировать выполнение кода (например, для освобождения ресурсов) независимо от того, было ли выброшено исключение в блоке try или нет.
Порядок выполнения:
- Выполняется блок
try. - Если возникло исключение — выполняется соответствующий блок
catch. - Всегда, после
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
Этот код выполнится ВСЕГДА