Ответ вслух Junior Исключения обновлено

Как работает finally

Вопрос

Расскажите, как работает finally и какие с ним бывают сюрпризы.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Блок finally выполняется при любом выходе из try: нормальном, через return, break или исключение. Не выполнится только если JVM остановилась, например System.exit.

Что должно прозвучать в ответе

  • Выполняется при любом выходе из try, включая return и исключение

  • Не выполняется при System.exit или крахе JVM

  • return в finally перекрывает результат и глотает исключение

  • Исключение в finally заменяет исходное

  • Изменение переменной в finally не меняет уже вычисленный результат return

  • Для ресурсов лучше try-with-resources

Что могут спросить следом

  • Что вернёт метод, если в try return x, а в finally x++?
  • Чем try-with-resources лучше закрытия в finally?

Разбор

Блок finally выполняется при любом выходе из try: нормальном, через return, break или исключение. Не выполнится только если JVM остановилась, например System.exit. Сюрпризы такие. Если в try есть return x, значение вычисляется до finally, и изменение x в finally результат не поменяет (для примитива; если вернули ссылку на изменяемый объект, изменения объекта будут видны). Если в finally стоит свой return, он перекрывает результат и молча глотает исключение из try. Если finally сам бросает исключение, оно заменяет исходное. Поэтому в finally пишу только простой код очистки, а ресурсы закрываю через try-with-resources: там порядок закрытия обратный и исключения закрытия становятся suppressed.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.