Что вернётся из try-catch-finally?



Вопросы такого типа популярны на собеседованиях. Поведение try-catch-finally в спецификации описывается через 24 предложения "если". Логика запутанная, и легко допустить ошибку.



Чтобы решать такие задачки, воспользуйтесь следующей моделью:

Результатом блока try-catch-finally могут быть 3 варианта:

🔸Ничего

🔸Возврат значения

🔸Исключение

Представим, что результат записывается в переменную result. В начале работы там "ничего".



Блоки обрабатываются в строгом порядке:

1️⃣ try

2️⃣ catch

3️⃣ finally

На каждом шаге переменная result может быть перезаписана. Итоговое значение result и будет результатом выполнения. Особый случай — при вызове System.exit(0) выполнение прекращается сразу же .



Разберём пример из опроса:

▫️try установит результат на "вернуть try".

▫️Блока catch нет.

▫️В finally результат меняется на "вернуть finally".

Итог: вернётся "finally"



Другой пример:

try { throw new NPE(); }

catch (SecurityEx e)

{ return "ex"; }

finally {}



▫️В блоке try результатом станет "NPE".

▫️Блок catch пропускается, т.к нет подходящего типа исключения.

▫️В блоке finally результат не переопределяется.

Итог: выброс NPE.



Этот пример важен, потому что такие ошибки часто встречаются на практике. Блок finally - не оберег от исключений. Если результат "исключение" дальше не переопределён, он пробрасывается в вышестоящий метод.