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


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

Код A:

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

Код B:

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

9 ответов:

  • что произойдет, если исключение, ты не брошен? (Я надеюсь, что вы не ловите Throwable...)
  • что произойдет, если вы вернетесь из блока try?
  • что произойдет, если блок catch бросает исключение?

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

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

InputStream in = new FileInputStream("somefile.xyz");
try {
    somethingThatMightThrowAnException();
}
finally {
    // cleanup here
    in.close();
}

вы можете поместить код, который вы хотите в любом случае выполнить, независимо от того, что происходит в вашем блоке 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();
}

наконец, всегда выполняется, где, как ваш код после улова не может.

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

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

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

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

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

finally всегда выполняется, если JVM не был выключен,finally просто предоставляет метод для размещения кода очистки в одном месте.

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

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