5

나는 노력하고있다.My application's under maintanace module

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

내가 지나갈 때isundermaintanace true마침내 실행되지 않습니다.

내가 뭘 놓치고 있니? 거기에 다른 방법이 있습니까?


  • 당신이 할 수있는 유일한 일은 아마도 변화 일 것입니다.System.exit(1)다른 방법으로 앱을 종료 할 수 있습니다. - Louis Wasserman

5 답변


15

FinallyVM을 죽이면 (또는 VM이 다른 방법으로 죽으면) 실행되지 않습니다. System.exit ()는 프로그램을 죽이는 매우 조잡한 방법이지만, 마침내 고수준의 OOP 개념입니다. System.exit ()은 가능한 빨리 정리를하지 않고 매우 빠르게 처리합니다.

작업 관리자에 들어가서 프로세스를 죽이거나kill -9그 과정에서 마침내 실행을 기대합니까? 막연하게 (대단히막연하게) 똑같이.


주의 할 점이 몇 가지 있습니다. 특히, 나는 포스트의 첫 부분에서 약간 거짓말을했다. 비유하는 것은 오해의 소지가있다.System.exit()진정으로 즉시 프로그램을 죽이는 것. 특히 셧다운 훅이 실행되고구성된 경우, finalizers 실제로 실행할 수 있습니다. 그러나, 문서는 사용에 대해 상당히 강력하게 제안합니다.runFinalizersOnExit.


  • 첫 번째 문장 만 +1하십시오. 그것은 우아한 방법입니다. - corsiKa
  • 하지만 어때?is there any other way to do that ??? - user000001
  • @ user000001 주소를 편집하면됩니다. System.exit ()이 종료 된 후에 파이널 라이저를 실행할 필요가 있다는 것은 디자인이 망가 졌음을 보여주는 아주 심한 표시입니다. - Corbin
  • @Corbin +1 파이널 라이저에 대해 알지 못했습니다. - user000001

2

System.exit다른 코드 실행을 우회하여 즉시 종료됩니다 (예 :finally블록). 프로그램 종료 후finally블록이 실행되고 대신 예외가 발생합니다.


2

try 또는 catch 코드가 실행되는 동안 JVM이 종료되면 예를 들어System.exit()finally 블록은 실행되지 않을 수 있습니다. 마찬가지로 try 또는 catch 코드를 실행하는 스레드가 인터럽트되거나 종료되면 전체적으로 응용 프로그램이 계속 실행 되더라도 finally 블록이 실행되지 않을 수 있습니다.


1

유일한예외적 인 경우마지막으로 블록이 실행되지 않는 곳은 'System.exit (1)'을finally block, 이는 예상 된 동작입니다.System.exit(1)JVM을 종료합니다.


1

전화하면System.exit()코드가 실행되지 않습니다.finally이 호출은 JVM을 종료하기 때문입니다.

연결된 질문


관련된 질문

최근 질문