Возврат значения из finally: что получит вызывающий код

Метод вернёт строку { между скобок }. Return в finally заменит аварийное завершение catch обычным возвратом, поэтому оба исключения будут скрыты от вызывающего кода.

Короткий ответ

Что ответить на собеседовании

Метод вернёт строку { между скобок }. Return в finally заменит аварийное завершение catch обычным возвратом, поэтому оба исключения будут скрыты от вызывающего кода.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какое значение будет возвращено методом gring() при его выполнении. Учтите порядок обработки исключений и тот факт, что оператор return, находящийся в блоке finally, переопределяет любые выброшенные исключения.

public String gring() {
    try {
        throw new IllegalStateException("Ошибка 1");
    } catch (IllegalStateException ex) {
        throw new IllegalStateException("Ошибка 2", ex);
    } finally {
        return "{ между скобок }";
    }
}

Ответ

Метод вернёт строку { между скобок }. Return в finally заменит аварийное завершение catch обычным возвратом, поэтому оба исключения будут скрыты от вызывающего кода.

Сначала создаётся «Ошибка 1», затем catch оборачивает её в «Ошибка 2». Перед выходом выполняется finally; его return отменяет распространение второго исключения. Такой стиль опасен потерей информации об ошибке. В finally следует оставлять освобождение ресурсов без return, а для AutoCloseable предпочитать try-with-resources. Если важно обработать ошибку, делайте это явно в catch.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее