시스템의 차이. Java에서 exit (0), System.exit (-1), System.exit (1)


280

Java에서 다음과의 차이점을 알고 싶습니다.

System.exit(0);
System.exit(-1);
System.exit(1);

위의 코드를 언제 적절하게 사용해야합니까?


17
왜 답변을 '우수 답변'으로 표시하지 않아 녹색 체크 표시가 나타 납니까? 그것은 다른 사람들이 가장 좋은 것이 무엇인지 알도록 도와줍니다 !!
Saksham Goyal

답변:


252

프로그램 실행이 양호하거나 나쁜 경우 종료 매개 변수가 규정되어야합니다. 오래된 프로그래밍 언어의 일종으로, 문제가 있는지, 무엇이 잘못되었는지를 아는 것이 유용합니다.

종료 코드는

  • 0 처형이 잘되었을 때;
  • 1, -1, whatever != 0약간의 오류가 발생했을 때, 당신은 오류의 다른 종류에 대해 서로 다른 값을 사용할 수 있습니다.

올바른 종료 코드가 양수 (UNIX에서는 의미)로 범위에 따라 사용 된 경우 :

  • 1-127사용자 정의 코드 (을 호출하여 생성됨 exit(n))
  • 128-255SIGSEGV 또는 SIGTERM 과 같은 다른 유닉스 신호로 인해 종료에 의해 생성 된 코드

그러나 Java로 코딩하는 동안 신경 써야한다고 생각하지는 않습니다. 약간의 정보 일뿐입니다. 프로그램이 표준 도구와 상호 작용하도록하려는 경우 유용합니다.


31
또한 종료 코드 0은 셸에서 true로 계산되고 다른 코드는 false로 계산됩니다. 따라서 java MyApp && echo success"성공"을 인쇄합니다. MyApp에 종료 코드가 0 인 경우, 즉 exit(0)오류없이 기본 메소드의 호출 또는 종료에 도달 한 경우.
sepp2k

16
앱을 스크립트에서 사용할 수있는 경우 항상 종료 코드를 관리하십시오. 스크립트 중간에 도구가 자동으로 실패하거나 스택 추적을 인쇄하고 0으로 종료하는 것은 매우 성가신 일입니다.
Doncho Gunchev

6
주의 할 사항 : -1을 반환 할 때 가능한 최대 양수는 부호없는 컨텍스트로 반환됩니다 (2의 보수 표현에서 -1은 항상 숫자의 바이트 수에 관계없이 모든 비트를 설정 함). 따라서 -1은 일반적으로 비 특정 오류를 리턴 할 때 리턴되며 이미 정의되고 문서화 된 가능한 오류 코드와 충돌하지 않기를 원합니다. 예를 들어, 오류 코드 1은 쓰기 오류로 문서화되었을 수 있습니다. 오류 코드 2는 오류 등을 읽을 수 있습니다.
Nylon Smile

실제로 유닉스의 * exit (2)`에서 나온 '유연성'입니다.
Lorne의 후작

127

Zero => 다 괜찮아

Positive => 내가 잘못했을 가능성이있는 것으로 잘못 예상 됨 (잘못된 명령 줄, 파일을 찾을 수 없음, 서버에 연결할 수 없음)

Negative=> 내가 전혀 예상하지 못한 것이 잘못되었습니다 (예 : 시스템 오류-예상치 못한 예외-외부 강제 종료 kill -9)

(128보다 큰 값은 실제로 8 비트 부호있는 이진 또는 2의 보수로 간주되는 경우 음수입니다)

여기에 좋은 표준 종료 코드가 많이 있습니다.


12
"내가 잘못 될 것으로 예상되는 일이 잘못되었다"는 "Everything Okay"와 같은 소리가납니다.
tobe

"개발자로서 내가 기대할 수있는 것들"사용자 오류 대 시스템 오류; 128-255는 8 비트 부호가있는 바이너리입니다.
robert

6
@tobe "실수 로 잘못 될 수 있다고 예상되는 것"은 실제로 잘못되었습니다.;)
Marcel Hernandez

1
8 비트 부호없는 및 -1 (255)가되고, 256 (킬의 예 : 0 신호가되도록, 256 개조 바와 같이 배시 취급 종료 코드 kill -15종종 종료 코드의 결과) 128+signal, 그러나 (별도로 9 행)이 처리 될 수 있으며 다른 종료 코드를 반환하십시오. -에서이 kill -15마크 신호가 아닌 PID로 번호가 마이너스 신호를 만들지 않는 것이다.
Matthew

당신이 할 때 System.exit(-1)쉘에 echo $?'255'를 얻습니다. 이것이 킬 매개 변수의 '-'때문이 아니라 음수가 시스템 오류라고 말한 이유입니다. 내가 그렇게 생각했다고 진심으로 생각 했니? 그러나 Bash가 이러한 코드를 구성하는 메커니즘을 설명해 주셔서 감사합니다.
robert

51

System.exit(system call)종료 시퀀스를 시작하여 현재 실행중인 Java 가상 머신을 종료합니다. 인수는 상태 코드 역할을합니다 .

일반적으로 0이 아닌 상태 코드는 비정상 종료를 나타냅니다.

  System.exit(0) or EXIT_SUCCESS;  ---> Success
  System.exit(1) or EXIT_FAILURE;  ---> Exception
  System.exit(-1) or EXIT_ERROR;   ---> Error

Java 에서 더 읽기

0성공적인 실행을위한 Unix 및 Linux 시스템 및 1실패한 실행을위한 이상.


3
이 답변은
@robert

Java doc에서 종료 코드 -1이 ERROR를 나타내는 것으로 언급되지 않았으며 대신 "상태-종료 상태입니다. 일반적으로 0이 아닌 상태 코드는 비정상 종료를 나타냅니다."
Damith

EXIT_*Java에는 존재하지 않습니다.
juanchito


6

exit(0)일반적으로 성공적인 종료를 나타내는 데 사용됩니다. exit(1)또는 exit(-1)0이 아닌 다른 값은 일반적으로 종료에 실패했음을 나타냅니다.


인수가 코더에 의해 전달되는 이유는 무엇입니까? 메서드가 반환 값이 아닙니다. 종료 결과를 어떻게 나타낼 수 있습니까?
ankotliner

4

여기에 답이 있습니다.

System.exit(0);// normal termination - Successful - zero
System.exit(-1);//Exit with some Error
System.exit(1);//one or any positive integer // exit with some Information message

2

좋은 오류는 255보다 큰 오류 코드가 오류 코드 % 256으로 변환된다는 것입니다. 사용자 지정 오류 코드> 255를 사용하고 응용 프로그램 논리에서 정확한 오류 코드를 기대하는 경우 특히주의해야합니다. http://www.tldp.org/LDP/abs/html/exitcodes.html


1

system.exit ()에 넣은 숫자의 차이는 다른 답변에 설명되어 있습니다. 그러나 실제 차이점은 System.exit ()가 호출 프로세스로 리턴되는 코드라는 것입니다. 프로그램이 운영 체제에 의해 호출되면 반환 코드는 OS에 system.exit ()가 모든 것보다 0을 반환했지만 잘못되지 않은 경우 상위 프로세스에 처리기가있을 수 있음을 OS에 알립니다


0

다른 사람들 0은 성공의 의미로 대답 합니다.

박쥐 파일 (창)을 사용 System.exit(x)하면 효과가 있습니다.

코드 자바 (myapp) :

if (error < 2){
    help();
    System.exit(-1);    
}
else{
    doSomthing();
    System.exit(0);
}

}

박쥐 파일 :

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --

-2

상태가 0이 아닌 상태 코드 인 System.exit (0) 은 비정상 종료를 나타냅니다.

System.exit (1) -일부 오류로 인해 종료에 실패했음을 의미합니다


인수는 항상 '상태 코드로 사용됩니다'. 그것이 0 일 때만이 아닙니다.
Lorne의 후작

어 그래 . 내 나쁜 EJP 죄송합니다
androminor

-7
class calc{
public static void main(String args[])
{
    int a, b, c;
    char ch;
    do{

        Scanner s=new Scanner(System.in);

                System.out.print("1. Addition\n");
                System.out.print("2. Substraction\n");
                System.out.print("3. Multiplication\n");
                System.out.print("4. Division\n");
                System.out.print("5. Exit\n\n");

                System.out.print("Enter your choice : ");
                ch=s.next().charAt(0);
                    switch (ch)
                    {
                        case '1' :
                        Addition chose1=new Addition();
                        chose1.add();
                        break;

                        case '2' :
                        Substraction chose2=new Substraction();
                        chose2.sub();
                        break;

                        case '3' :
                        Multiplication chose3= new Multiplication();
                        chose3.multi();
                        break;

                        case '4' :
                        Division chose4=new Division();
                        chose4.divi();
                        break;

                        case '5' :
                        System.exit(0);
                        break;

                        default :
                        System.out.print("wrong choice!!!");
                        break;
                    }
        System.out.print("\n--------------------------\n");                     
    }while(ch !=5); 
}

}

위의 코드에서 System.exit (0); 내가 사례 5를 누르면 제대로 종료되지만 System.exit (1)을 사용할 때; 그리고 케이스 5를 누르면 오류가 발생하고 다시 케이스 15로 시도하면 올바르게 종료됩니다. 우리는 인수에 int를 넣을 때마다 해당 위치에서 문자를 가져옵니다. (4) 해당 문자열에서 5 번째 문자를 받는다는 의미이고 (3) 입력 된 문자열에서 4 번째 문자를 받는다는 의미

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.