Есть ли такой случай, когда в блоке try\finally не выполняется finally?

Я изучаю свой тест по объектно-ориентированному программированию, и мне было интересно, есть ли какой-либо случай, когда-либо, учитывая следующий код:

try {
    do something
} catch (someException e) {

} finally {
    do something
}

блок finally не будет выполняться?


person Dave    schedule 14.08.2010    source источник
comment
Выдергивание вилки должно сделать это.   -  person PreciousBodilyFluids    schedule 14.08.2010
comment
thedailywtf.com/Articles/My-Tales.aspx   -  person Michael Myers    schedule 14.08.2010


Ответы (4)


да. Если вы сломаете виртуальную машину Java или иным образом испортите ситуацию с помощью собственного кода, заставьте программу завершить работу или зациклиться/ожидать бесконечно внутри блока try.

Это единственные три случая, которые позволяют избежать выполнения блока finally.

person Borealid    schedule 14.08.2010
comment
Вызов System.exit или выключение компьютера, вероятно, считается причиной завершения работы программы... :-) - person Rasmus Kaj; 14.08.2010
comment
Если в блоке try вы вернетесь из функции, содержащей фразу try/catch/finally, будет ли по-прежнему выполняться блок finally? - person euphoria83; 15.08.2010
comment
@euphoria: да, конечно, это часть сделки, что блок finally гарантированно выполняется, когда код внутри соответствующего блока try завершается при нормальных обстоятельствах (включая обычные исключения) - person Jason S; 15.08.2010
comment
Придирка: если перед блоком finally выполняется блок catch, а бесконечный цикл/ожидание также не позволит выполнению достичь блока finally. Кроме этого, я думаю, у вас есть все случаи :-) - person meriton; 15.08.2010

Если вы позвоните System.exit(0) в try. Или сделайте что-то, что заставит JVM выйти или зависнуть (например, тупик). В противном случае - нет.

person Bozho    schedule 14.08.2010

Спецификация языка Java гарантирует, что finally вызывается до завершения оператора try.

Оператор try может не завершиться по обычным причинам, перечисленным в ответе Borealid.

person meriton    schedule 14.08.2010
comment
finally вызывается до завершения оператора try ??? не должно быть когда - person Jason S; 15.08.2010
comment
Оператор try- состоит из блока try-, любых блоков catch и, необязательно, блока finally. - person meriton; 15.08.2010

Блок finally обязательно будет выполнен, если управление выйдет из блока try или catch. Если вам каким-то образом удастся остановить выход элемента управления из этих блоков:

  • написав оператор выхода или

  • бесконечный цикл и т.д.

тогда блок finally не будет выполнен. Обычно мы пишем блок finally с целью «очистки».

person Shubham Pendharkar    schedule 02.08.2015