Метод вернёт строку { между скобок }. Return в finally заменит аварийное завершение catch обычным возвратом, поэтому оба исключения будут скрыты от вызывающего кода.
Возврат значения из finally: что получит вызывающий код
Метод вернёт строку { между скобок }. 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.