Какое исключение будет выброшено, если оно возникает и в блоке catch, и в блоке finally в Java?

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

Ответ

Будет выброшено исключение из блока finally. Исключение из блока catch будет подавлено (added as a suppressed exception).

Причина: Блок finally выполняется всегда, даже если в catch возникло новое исключение. JVM прекращает обработку исключения из catch и начинает обработку исключения из finally.

Пример:

try {
    throw new IOException("Ошибка в try");
} catch (IOException e) {
    throw new RuntimeException("Ошибка в catch", e); // Это исключение будет подавлено
} finally {
    throw new IllegalArgumentException("Ошибка в finally"); // Это исключение будет выброшено
}

Вывод в консоль:

Exception in thread "main" java.lang.IllegalArgumentException: Ошибка в finally
    at Main.main(Main.java:8)
    Suppressed: java.lang.RuntimeException: Ошибка в catch
        at Main.main(Main.java:6)
    Caused by: java.io.IOException: Ошибка в try
        ... 1 more

Практический вывод: Избегайте выброса исключений в finally, так как это может скрыть первоначальную причину ошибки. Используйте finally только для безопасного освобождения ресурсов.