[Java] 자바 프로그램 강제 종료 System.exit() 사용법

System 클래스를 이용하면 운영체제의 프로그램 종료, 키보드로부터 입력, 모니터로 출력, 메모리 정리, 현재 시간 읽기, 시스템 프로피티 읽기, 환경 변수 읽기등의 일부 기능을 사용할 수 있습니다. 

 

프로그램 종료(System.exit( ))

강제적으로 JVM을 종료시키고 싶을 때는 System 클래스의 exit() 메소드를 호출하면 됩니다. exit() 메소드는 현재 실행하고 있는 프로세스를 강제 종료시키는 역할을 합니다. exit() 메소드는 int 매개값을 지정하도록 되어 있습니다. 이 값을 종료 상태값이라고 합니다. 일반적으로 정상 종료일 경우 0으로 지정하고 비정상 종료일 경우 0이외의 다른값을 줍니다.

System.exit(0); //정상종료
System.exit(1); //비정상종료

 

System.exit()메서드는 어떤 값을 주더라도 종료가 되는데, 만약 특정 값이 입력되었을 경우에만 종료하고 싶다면 자바 보안 관리자를 직접 설정해서 종료 상태값을 확인하면 됩니다. System.exit()가 실행되면 보안관리를 입력되지 않으면 SecurityException을 발생시켜 System.exit()를 호출한 곳에서 예외 처리를 할 수 있도록 해줍니다. checkExit()가 정상적으로 실행되면 JVM은 종료가 됩니다.

 

가급적이라면 사용을 피하자

System.exit을 사용한다면 즉시 해당 프로세스가 파괴되기에 그 이후에 정의된 코드 문장들은 실행되지 않습니다. 그렇기에 실질적 결과는 main()에서 return하는 것과 같지만, 사실 exit()의 호출은 그리 좋은 방법은 아닙니다. 프로그램의 뒷부분에 정의되어 있을 수 있는 자원의 해제나 데이터베이스 관련 코드들이 실행되지 않을 가능성이 높아지기 때문입니다. 또 멀티스레드 환경에서 문제가 일어날 가능성도 있죠. 가급적이면 조금 귀찮겠지만 main()에서 정상적으로 return할 수 있도록 유도하시는게 어떨까 합니다.

 

종료 상태 값이 5가 입력되면 JVM을 종료하도록 보안관리자를 설정

System.setSecurityManager(new SecurityManaget() {
    @Override
    public void checkExit(int status) {
        int(status != 5){
            throws new SecurityException();
        }
    }
});

 

보안관리자 설정 후 System.exit( ) 예제

public class ExitExample {
  public static void main(String[] args)  {
    //보안 관리자 설정
    System.setSecurityManager(new SecurityManager(){
      @Override
      public void checkExit(int status) {
        if(status != 5) {
          throw new SecurityException(); // status가 5가되면 프로세스 종료
        }else {
          System.out.println("시스템 종료!");
        }
      }
    });
    
   for(int i=0; i<10; i++) {
     System.out.println(i);
     try { //try catch문 미 실행 시 오류
       System.exit(i); // i 가 5가 될때 프로세스 종료
     }catch(SecurityException e) {}
    }
  }
}

예제

참고 : https://altongmon.tistory.com/205

댓글

Designed by JB FACTORY