Почему мы используем наконец блоки? - PullRequest
77 голосов
/ 06 августа 2010

Насколько я могу судить, оба следующих фрагмента кода будут служить одной и той же цели. Почему у finally блоков вообще?

Код A:

try { /* Some code */ }
catch { /* Exception handling code */ }
finally { /* Cleanup code */ }

Код B:

try { /* Some code */ }
catch { /* Exception handling code */ }
// Cleanup code

Ответы [ 10 ]

129 голосов
/ 06 августа 2010
  • Что произойдет, если возникнет исключение, которое вы не обрабатываете? (Надеюсь, ты не поймаешь Throwable ...)
  • Что произойдет, если вы вернетесь из блока try?
  • Что произойдет, если блок catch выбрасывает исключение?
Блок

finally гарантирует, что однако вы выйдете из этого блока (по модулю нескольких способов явного прерывания всего процесса), он будет выполнен Это важно для детерминированной очистки ресурсов.

10 голосов
/ 06 августа 2010

Обратите внимание, что (по крайней мере в Java, вероятно, также в C #) также возможно иметь блок try без catch, но с finally. Когда в блоке try происходит исключение, код в блоке finally запускается до того, как исключение выдается выше:

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}
7 голосов
/ 06 августа 2010

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

Также, если вы используете несколько catch и если вы хотите поместить некоторый код, которыйявляется общим для всех блоков catch, это место для размещения, но вы не можете быть уверены, что весь пробный код был выполнен.

Например:

conn c1 = new connection();
try {
    c1.dosomething();
} catch (ExceptionA exa) {
    handleexA();
    //c1.close();
} catch (ExceptionB exb) {
    handleexB();
    //c1.close();
} finally {
    c1.close();
}
5 голосов
/ 06 августа 2010

Наконец всегда выполняется, где ваш код после перехвата может не быть.

2 голосов
/ 12 сентября 2012

Даже если наше приложение принудительно закрыто, будут некоторые задачи, которые мы должны выполнить (например, освобождение памяти, закрытие базы данных, блокировка разблокировки и т. Д.), Если вы напишите эти строки кода в блоке finally, оно будет выполненовне зависимости от того, выдано ли исключение ...

Ваше приложение может быть набором потоков, Exception завершает поток, но не все приложение, в этом случае finally более полезно.

В некоторых случаях finally не будет выполняться, например, сбой JVM, завершение потока и т. Д.

1 голос
/ 06 августа 2010

Потому что вам нужен этот код для выполнения независимо от любых исключений, которые могут быть выброшены.Например, вам может потребоваться очистить некоторый неуправляемый ресурс (конструкция «using» компилируется в блок try / finally).

0 голосов
/ 10 марта 2019

Блок finally в java может быть использован для помещения кода «очистки», такого как закрытие файла, закрытие соединения и т. Д.


Блок finally не будет выполнен, если программа завершится (либо путем вызова System.exit () или вызвав фатальную ошибку, которая приводит к прерыванию процесса).

0 голосов
/ 09 июня 2016

Если блок catch генерирует какое-либо исключение, оставшийся код не будет выполнен, поэтому мы должны написать финальный блок.

0 голосов
/ 06 августа 2010

Могут быть случаи, когда вы захотите выполнить кусок кода, несмотря ни на что.Независимо от того, брошено исключение или нет.Тогда каждый использует finally.

0 голосов
/ 06 августа 2010

finally ВСЕГДА выполняется, если JVM не была закрыта, finally просто предоставляет метод для помещения кода очистки в одно место.

Было бы слишком утомительно, если бы вам пришлось помещать код очистки в каждый из блоков catch.

...