System.exit () приводит к неисполнению блока finally

Я работаю над My application's under maintanace module

try {
    if (isUndermaintanace) {
        System.exit(1);
    } else {
        prepareResources();
    }           
} catch (Exception e) {
    printStack(e);
} finally {
    cleanResources();
}

Когда я прохожу isundermaintanace true, наконец, не выполняется.

Что мне не хватает? Есть ли другой способ сделать это?


person Suresh Atta    schedule 15.02.2013    source источник
comment
Вероятно, единственное, что вы можете сделать, это изменить System.exit(1), чтобы закрыть приложение другим способом.   -  person Louis Wasserman    schedule 16.02.2013


Ответы (5)


Finally не выполняются, если вы убиваете виртуальную машину (или если виртуальная машина умирает другим способом). System.exit () - довольно грубый метод уничтожения программы, тогда как, наконец, это концепция ООП высокого уровня. System.exit () отключается очень быстро, выполняя минимальную очистку.

Если вы войдете в диспетчер задач и завершите процесс или выдадите kill -9 процессу, ожидаете ли вы, что, наконец, он выполнится? Это примерно (очень смутно) одно и то же.


Стоит отметить несколько моментов. В частности, я немного соврал в первой части поста. Ошибочно сравнивать System.exit() с действительно мгновенным уничтожением программы. В частности, запускаются перехватчики выключения и если настроено, финализаторы действительно могут быть запущены. Обратите внимание, однако, что в документации довольно категорически не рекомендуется использовать runFinalizersOnExit.

person Corbin    schedule 15.02.2013
comment
+1 только за первое предложение. Какой изящный способ выразиться. - person corsiKa; 16.02.2013
comment
А как насчет is there any other way to do that ??? - person user000001; 16.02.2013
comment
@ user000001 Просто редактирую свой ответ, чтобы решить эту проблему. Обратите внимание, что необходимость запуска финализатора после System.exit () является довольно серьезным признаком поломки дизайна. - person Corbin; 16.02.2013
comment
@Corbin +1 Я не знал о финализаторах. - person user000001; 16.02.2013

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

person jacobm    schedule 15.02.2013

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

person nsgulliver    schedule 15.02.2013

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

person PermGenError    schedule 15.02.2013

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

person robonerd    schedule 15.02.2013