Как работает finally
Вопрос
Расскажите, как работает finally и какие с ним бывают сюрпризы.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Выполняется при любом выходе из try, включая return и исключение
Не выполняется при System.exit или крахе JVM
return в finally перекрывает результат и глотает исключение
Исключение в finally заменяет исходное
Изменение переменной в finally не меняет уже вычисленный результат return
Для ресурсов лучше try-with-resources
Что могут спросить следом
- Что вернёт метод, если в try
return x, а в finallyx++? - Чем 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 ошибок.