Java

[Java]자바 프로그램을 강제로 종료하는 System.exit() 메서드

DevStory 2022. 11. 3.

System.exit() 메서드

System.exit() 메서드는 System 클래스에 존재하는 void 타입의 정적(static) 메서드입니다.

아래 코드는 System 클래스에 존재하는 exit() 메서드 구문입니다.

public static void exit(int status) {
  Runtime.getRuntime().exit(status);
}

exit() 메서드는 int 타입의 매개 변수를 전달받으며, 실행 중인 자바 프로그램을 강제로 종료합니다. 매개 변수는 상태 코드를 의미하며 0이 아닌 상태 코드는 비정상적인 종료로 간주됩니다.

System.exit() 메서드를 호출하면 JVM이 먼저 종료되고 프로그램이 종료됩니다. JVM이 먼저 종료되므로 System.exit() 메서드 이후의 코드는 실행되지 않습니다.


System.exit() 메서드를 사용하는 이유

System.exit() 메서드는 일반적으로 비정상적인 조건에 의해 즉시 프로그램을 종료해야 하는 경우 사용합니다. 또한 main() 메서드가 아닌 다른 메서드에서 프로그램을 종료해야 하는 경우에도 사용합니다.

참고로 System.exit() 메서드를 호출하여 프로그램을 종료하는 것은 좋은 방법이 아닙니다. System.exit() 메서드를 호출하면 main() 메서드를 종료한 것과 동일하게 동작하며, JVM이 종료될 때까지 System.exit() 메서드를 호출하는 스레드도 차단합니다. 만약, Shutdown hook(종료 후크)가 차단된 스레드에 작업을 진행하면 JVM이 종료되는 절차가 멈추게 되며 교착 상태에 빠지게 됩니다.


try-catch-finally문에서 System.exit() 메서드 호출

다음은 System.exit() 메서드를 사용하는 간단한 예제입니다.

10을 0으로 나누면 ArithmeticException 예외가 발생하므로 catch문이 실행됩니다.

catch문에서 System.exit() 메서드를 호출하여 프로그램을 종료합니다.

public static void main(String args[]) {
  try {
    System.out.println("try");
    System.out.println(10 / 0);
  } catch (Exception ex) {
    System.out.println("catch");
    System.exit(0);
  } finally {
    System.out.println("finally");
  }
}

[실행 결과]

try
catch

위 예제를 통해 알 수 있는 사실은 finally문이 실행되지 않았다는 것입니다. System.exit() 메서드가 JVM을 종료하므로 finally문이 실행하는 것을 허용하지 않습니다.


상태 코드

int 타입의 모든 정수를 상태 코드로 전달할 수 있으며, 0을 제외한 값은 비정상 종료입니다.

System.exit() 메서드 동작과정을 파헤치면, Shutdown 클래스의 exit() 메서드를 호출하는 것을 확인할 수 있습니다.

if문에서 status가 0이 아니면 runFinalizersOnExit라는 변수의 값을 false로 할당합니다. 따라서, 0을 제외한 값은 비정상 종료입니다.

반응형

댓글