3

Привет. Какая разница между использованием finally и помещением кода просто после блока try-catch?

То есть вместо

try {
    ...
}catch(Exception e){
    ...
}finally{
    <код>
}

Написать

try {
    ...
}catch(Exception e){
    ...
}
<код>

На ум приходит разве что наличие в блоках try и catch слова return, а в блоке finally действий, обязательных при завершении метода.

2 ответа 2

14

Блок finally будет выполнен даже если вы выполняете return в try-блоке, а также если исключение не будет поймано в блоке catch (например, если блок catch отсутствует, или тип исключения не совпадает с типом, обрабатываемым блоком catch). А также, если код catch-блока сам выбросит исключение. Во всех этих случаях код после блока finally выполнен не будет.

Кстати, код finally не будет выполнен, если код до него успеет вызвать System.exit() или произойдёт креш JVM (или процесс будет каким-либо внешним образом уничтожен).

4

Код в блоке finally выполнится всегда, вне зависимости от того, будет вброшено исключение или нет. Если поместить код просто после блока try-catch, то в случае вброса исключения этот код не выполнится, так как из-за исключения прервется выполнение метода. Поправьте меня, если я не прав.

Поэтому, если нужно, например, закрыть поток или освободить ещё какие-то ресурсы в случае вброса исключения, нужно использовать блок finally

2
  • Разве прервётся выполнение метода? Разве не прервётся выполнение блока try?
    – sinedsem
    1 авг 2014 в 20:22
  • Да, тут немного запамятовал, проигнорируется оставшаяся часть блока try.
    – Yuri_Prime
    1 авг 2014 в 20:30

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.