Java
Try catch finally, когда используют finally?
Можите сказать а зачем в try catch нужен finally?
Представим, что в некотором методе есть блок кода:
а) Блок 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. Например, там могут закрываться файлы или сетевые соединения.
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. Например, там могут закрываться файлы или сетевые соединения.
Для того, чтобы задать код, который обязан быть выполнен при выходе из блока кода - независимо от того, было исключение или нет.
Это в большей степени трюкачество, чем необходимость. Например, у тебя в функции несколько return и перед каждым из них надо выполнить идентичный блок кода (закрыть файл, сделать запись в логе и т.п.). Ты просто оборачиваешь содержимое функции в try и прописываешь в finally этот код. В результате, код в finally будет автоматически выполнен перед любым из return.
Это в большей степени трюкачество, чем необходимость. Например, у тебя в функции несколько return и перед каждым из них надо выполнить идентичный блок кода (закрыть файл, сделать запись в логе и т.п.). Ты просто оборачиваешь содержимое функции в try и прописываешь в finally этот код. В результате, код в finally будет автоматически выполнен перед любым из return.
Нужен для очистки выделенной памяти под сущности в блоках try, catch
Сергей Нестеров
Т.е если catch не выполнился то выполняется finally?
Дмитрий Беломытцев
Если есть блок finally, он обязательно выполнится вне зависимости от того, поймал ли catch что-то.
Похожие вопросы
- Стоит ли использовать Iterable вместо Set?
- Какой список лучше использовать ArrayList от LinkedList Java?
- Стоит ли во всех случаях сделать методы класса статичным, если они не используют абсолютно никакое поле класса?
- что за аргумент InputStreamReader у bufferedReader и зачем его использовать? без него работать не будет?
- Что за НЕ использовать запрещено?)
- Как удалить папку system32 используя язык java
- Как думаете, стало бы ПО стабильнее, если бы все компиляторы сами ВЕСЬ код "заворачивали" в try-catch'и?
- Try{ }catch c++ Можете по-простому объяснить операторы try,catch? Cпасибо
- В чём необходимость использования блока try catch вместо if в С++ ?
- Почему в крупных проектах пытаются избежать использование try catch?