В чем разница между окончательно и окончательно? - PullRequest
7 голосов
/ 29 апреля 2011

В чем разница между

try {
     // action A
}
catch(Exception e) {
     // action B
}
finally {
     // action C
}

и

try {
     // action A
}
catch(Exception e) {
     // action B
}
// action C

Я прочитал, что вы можете вернуться изнутри блока catch и при этом выполнить блок finally,Есть ли другие отличия?

Ответы [ 6 ]

9 голосов
/ 29 апреля 2011

То, что происходит в блоке finally, гарантированно произойдет независимо от того, что происходит в блоке try-catch.Если происходит исключение, которое не инкапсулировано Exception (например, расширяется Throwable, например, различными Error с), то оно все еще запускает блок finally.

Следует помнить одну вещь: если в блоке finally выбрасывается RuntimeException или из него выходит другой Exception, тогда rest блока finally не выполнить.Кроме того, как указал лорд Торгамус, это зависит от работы JVM.Кроме того, и, вероятно, очевидно, это также зависит от того, что поток не был остановлен.

5 голосов
/ 29 апреля 2011

Большинство существующих ответов содержат части правильного ответа, но ни один из них не совсем точен.

Блок finally всегда гарантированно будет достигнут после блоков try и, возможно, catch, если JVM не отключится заранее. Однако, если фрагмент кода внутри блока finally завершает работу JVM или создает собственное исключение, конец блока может быть не достигнут.

Согласно Сертифицированному Sun по программированию для Java 6 Учебное пособие :

  • Единственное исключение из правила finally -will-всегда-вызываться - это то, что finally не будет вызываться, если JVM завершит работу.

  • То, что вызвано finally, не означает, что оно завершится.

Последнее слово, как всегда, Спецификация языка Java . Поведение finally подробно объясняется в §14.20.2 Выполнение try-catch-finally .

Как дополнительное примечание: вы правы, что return в try не остановит запуск finally. Фактически, finally вводится сразу после того, как return обнаружен, до он выполняется.

2 голосов
/ 29 апреля 2011

Лучше взгляните на этот пример, ресурсы всегда закрыты, даже если я вернусь или распространю значение выше.

try {
 //action A
 return 0;
} catch (Exception e){
 //action C
 throw new Excpetion("Probleme here",e)
} finnaly {
 //action C
 resources.close();
}

Если действие A и be такие же примитивные, как int a = 0, то нетразница, но в более сложных ситуациях, таких как этот, в finnaly блоке используется

1 голос
/ 29 апреля 2011

из Sun Tutorials

Примечание. Если JVM завершает работу во время выполнения кода try или catch, блок finally не будет выполнен.Аналогично, если поток, выполняющий код try или catch, прерывается или уничтожается, блок finally не будет выполняться, даже если приложение в целом продолжит работу.

Я не знаю других способовнаконец, блок не будет выполнен ...

0 голосов
/ 29 апреля 2011

Блок try используется для обработки исключений.Если есть какой-либо регистр / код, который сгенерирует исключение, например, если мы разделим число на ноль (0), то это сгенерирует исключение, и процесс будет остановлен.В этом случае, если мы поместим наш код в блок try, исключение будет ловиться блоком catch, и процесс не будет завершен.И, наконец, заблокировать гарантию выполнения написанного там кода.Поэтому, если нам нужно завершить / закрыть процесс, даже если его выполнение будет успешным или нет (например, в случае сетевого программирования нам необходимо разорвать соединение, чтобы другие устройства могли использовать это соединение), мы используем блок finally.1001 *

0 голосов
/ 29 апреля 2011

Код внутри блока finally гарантированно будет выполняться, если JVM продолжит работу.

Это означает, что даже если то, что находится в действии B, вызывает другое новое исключение или не перехватывает исключение в действии A или вызывается возврат, код в действии C. будет выполняться.

...