Java

Try catch finally, когда используют finally?

Можите сказать а зачем в try catch нужен finally?
Представим, что в некотором методе есть блок кода:
 try {
[1]
if (...) {
return; [2]
}
[3]
} catch (IOException e) {
[4]
} finally {
[5]
}
[6]
Варианты развития событий:

а) Блок try прошел, инструкции [1] и [3] сработали без исключений.
Далее выполняется блок finally [5], а после него продолжается выполнение метода, начиная с инструкции [6].

б) Блок try выполнил [1] и совершил возврат [2]. После этого метод должен завершиться, но непосредственно перед завершением срабатывает блок finally [5]. Инструкция [6] не выполняется, так как метод завершен.

в) Блок try во время [1] выбросил исключение IOException. Его поймал блок catch и обработал инструкцией [4]. Затем работу блока завершил блок finally [5], после чего выполнение пошло дальше на [6].

г) Блок try во время [1] выбросил исключение NullPointerException. Блок catch такие не ловит, поэтому исключение прерывает работу метода, чтобы вылететь на уровень выше, в точку вызова метода. Но перед вылетом выполняется блок finally [5]. Инструкция [6] не выполняется, так как метод прерван.

Видите разницу между finally [5] и простой инструкцией [6]?

Блок finally нужен для выполнения кода, который должен сработать в конце независимо от того, как закончилась работа в try…catch. Например, там могут закрываться файлы или сетевые соединения.
Дмитрий <Княzzь> Князев
Дмитрий <Княzzь> Князев
54 261
Лучший ответ
Для того, чтобы задать код, который обязан быть выполнен при выходе из блока кода - независимо от того, было исключение или нет.

Это в большей степени трюкачество, чем необходимость. Например, у тебя в функции несколько return и перед каждым из них надо выполнить идентичный блок кода (закрыть файл, сделать запись в логе и т.п.). Ты просто оборачиваешь содержимое функции в try и прописываешь в finally этот код. В результате, код в finally будет автоматически выполнен перед любым из return.
Murat Otargaliev
Murat Otargaliev
64 671
Нужен для очистки выделенной памяти под сущности в блоках try, catch
Сергей Нестеров Т.е если catch не выполнился то выполняется finally?
Дмитрий Беломытцев Если есть блок finally, он обязательно выполнится вне зависимости от того, поймал ли catch что-то.