Почему мы используем окончательные блоки?
Насколько я могу судить, оба следующих фрагмента кода будут служить той же цели. Почему finally
блоки вообще?
Код A:
try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }
Код B:
try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code
Ответы
Ответ 1
- Что произойдет, если исключение, которое вы не обрабатываете, будет выброшено? (Надеюсь, вы не ловите
Throwable
...)
- Что произойдет, если вы вернетесь из блока try?
- Что произойдет, если блок catch генерирует исключение?
Блок A finally
гарантирует, что, несмотря на то, что вы выходите из этого блока (по модулю нескольких способов прерывания всего процесса явно), он будет выполнен. Это важно для детерминированной очистки ресурсов.
Ответ 2
Обратите внимание, что (в Java, по крайней мере, возможно, также в С#) также возможно иметь блок try
без catch
, но с finally
. Когда исключение происходит в блоке try
, код в блоке finally
запускается до того, как исключение будет поднято выше:
InputStream in = new FileInputStream("somefile.xyz");
try {
somethingThatMightThrowAnException();
}
finally {
// cleanup here
in.close();
}
Ответ 3
Вы можете захотеть поместить код, который вы хотите выполнить, независимо от того, что происходит в вашем блоке try или catch.
Также, если вы используете множественный catch, и если вы хотите поместить некоторый код, который является общим для всех блоков catch, это будет место для размещения, но вы не можете быть уверены, что весь код в try был выполнен.
Например:
conn c1 = new connection();
try {
c1.dosomething();
} catch (ExceptionA exa) {
handleexA();
//c1.close();
} catch (ExceptionB exb) {
handleexB();
//c1.close();
} finally {
c1.close();
}
Ответ 4
Наконец, всегда выполняется выполнение, где ваш код после улова не может быть.
Ответ 5
Несмотря на то, что наше приложение закрыто принудительно, будут выполняться некоторые задачи, которые мы должны выполнить (например, выпуск памяти, закрытие базы данных, блокировка релиза и т.д.), если вы напишете эти строки кода в блоке finally
, который он выполнит выбрано ли исключение или нет...
Ваше приложение может представлять собой набор потоков, Exception
завершает поток, но не все приложение, в этом случае finally
более полезно.
В некоторых случаях finally
не будет выполняться, например, JVM Fail, Thread terminate и т.д.
Ответ 6
Потому что вам нужен этот код для выполнения независимо от любых исключений, которые могут быть выбраны. Например, вам может понадобиться очистить некоторый неуправляемый ресурс (компиляция 'using' компилируется в блок try/finally).
Ответ 7
finally
Выполняется ALWAYS, если JVM не был закрыт, finally
просто предоставляет метод для размещения кода очистки в одном месте.
Было бы слишком утомительно, если бы вам пришлось поместить код очистки в каждый из блоков catch
.
Ответ 8
Бывают случаи, когда вы хотите выполнить часть кода независимо от того, что. Вызывается ли исключение или нет. Затем используется finally
.
Ответ 9
Если catch блокирует любое исключение, то оставшийся код не будет выполнен, поэтому мы должны записать окончательный блок.