Почему мы используем окончательные блоки?

Насколько я могу судить, оба следующих фрагмента кода будут служить той же цели. Почему 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 блокирует любое исключение, то оставшийся код не будет выполнен, поэтому мы должны записать окончательный блок.