2013-02-15 5 views
5

Я работаю на My application's under maintanace moduleSystem.exit() приводит unexecutable наконец, блок

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

Когда я передаю isundermaintanacetrue, наконец, не выполняется.

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

+0

Возможно, единственное, что вы можете сделать, это изменить 'System.exit (1)', чтобы закрыть приложение другим способом. –

ответ

15

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

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


Есть несколько вещей, которые стоит отметить. В частности, я немного солгал в первой части сообщения. Недостаточно уподобления System.exit(), чтобы действительно убить программу. В частности, запускаются крючки остановки, и if configured, финализаторы могут быть запущены. Обратите внимание, однако, что документы довольно сильно указывают на использование runFinalizersOnExit.

+0

+1 для первого предложения. Какой изящный способ выразить это. – corsiKa

+1

Но как насчет 'есть ли другой способ сделать это?'? – user000001

+0

@ user000001 Просто отредактируйте мой ответ на адрес. Обратите внимание, что необходимость запуска финализатора после System.exit() является довольно серьезным признаком сломанного дизайна. – Corbin

1

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

2

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

2

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

1

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

 Смежные вопросы

  • Нет связанных вопросов^_^