Diferença no sistema. exit (0), System.exit (-1), System.exit (1) em Java

280

Gostaria de saber a diferença entre os seguintes em Java

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

Quando devo usar o código acima de maneira apropriada?

giri
fonte
17
por que você não marcou a resposta como a 'melhor resposta' para que haja uma marca verde? ajuda outras pessoas a saber qual é a melhor !!
Saksham Goyal

Respostas:

252

O parâmetro de saída deve qualificar se a execução do programa foi boa ou ruim. É uma espécie de hereditariedade de linguagens de programação antigas, onde é útil saber se algo deu errado e o que deu errado.

O código de saída é

  • 0 quando a execução correu bem;
  • 1, -1, whatever != 0Quando ocorreu algum erro, você pode usar valores diferentes para diferentes tipos de erros.

Se eu estou correto, os códigos de saída costumavam ser apenas números positivos (quero dizer, no UNIX) e de acordo com o intervalo:

  • 1-127são códigos definidos pelo usuário (gerados por chamada exit(n))
  • 128-255são códigos gerados pela terminação devido a diferentes sinais unix como SIGSEGV ou SIGTERM

Mas não acho que você deva se importar ao codificar em Java, é apenas um pouco de informação. É útil se você planeja fazer com que seus programas interajam com ferramentas padrão.

Jack
fonte
31
Observe também que um código de saída 0 conta como verdadeiro no shell e qualquer outro código conta como falso. Assim java MyApp && echo success, imprimirá "sucesso" se o MyApp tiver um código de saída 0, ou seja, se chamar exit(0)ou simplesmente chegar ao final do método principal sem erro.
sepp2k
16
Sempre cuide do código de saída, se seu aplicativo puder ser usado em um script. É muito irritante ter uma ferramenta falhando silenciosamente no meio do seu script (ou imprimindo algum rastreamento de pilha e saindo com 0).
Doncho Gunchev
6
Uma coisa a observar: ao retornar -1, o maior número positivo possível é retornado em um contexto não assinado (na representação complementar de dois - -1 sempre define todos os bits, independentemente do número de bytes no número). Portanto, -1 geralmente é retornado quando você está retornando um erro não específico e não deseja que ele colidir com possíveis códigos de erro que já estão definidos e documentados. por exemplo, o código de erro 1 pode ter sido documentado como erro de gravação; código de erro 2 pode ser erro de leitura, etc.
Nylon Sorriso
É um 'tipo de hereditariedade' da saída do Unix * (2) `na verdade.
Marquês de Lorne
127

Zero => Tudo bem

Positive => Algo que eu esperava que poderia dar errado deu errado (linha de comando incorreta, não foi possível encontrar o arquivo, não foi possível conectar ao servidor)

Negative=> Algo que eu não esperava que deu errado (erro do sistema - exceção imprevista - rescisão forçada externamente kill -9)

(valores maiores que 128 são realmente negativos, se você os considera binários assinados de 8 bits ou complementam dois)

muitos códigos de saída padrão bons aqui

Robert
fonte
12
"Algo que eu esperava dar errado deu errado" soa como "Tudo bem".
tobe
"Coisas que eu, como desenvolvedor, pode razoavelmente esperar antecipar" Erro do Usuário vs Erro do Sistema; Na verdade, isso é abordado pelo pôster principal: os valores 128-255 são -ve wrt e binário assinado de 8 bits.
22414 Robert
6
@tobe É realmente mais como "algo que eu esperava poderia dar errado foi realmente errado";)
Marcel Hernandez
1
O Bash trata os códigos de saída como não assinado de 8 bits e modifica 256, de modo que o -1 se torna 255 e 256 se torna 0. Sinais (em caso de morte, por exemplo kill -15) geralmente resultam em código de saída 128+signal, mas (além de 9) podem ser manipulados e retornar um código de saída diferente. O -no kill -15é marca o número como um sinal e não um pid, não faz o negativo do sinal.
Matthew
Quando você faz System.exit(-1)e, em seu shell, echo $?você obtém '255'. É por isso que eu disse que números negativos são erros do sistema, não por causa do '-' no parâmetro kill. Você achou seriamente isso que eu pensei? Mas obrigado por explicar o mecanismo pelo qual o Bash constrói esses códigos.
22680 Robert
51

System.exit(system call)finaliza a máquina virtual Java atualmente em execução iniciando sua sequência de desligamento. O argumento serve como um código de status .

Por convenção, um código de status diferente de zero indica encerramento anormal.

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

Leia mais em Java

Nos sistemas Unix e Linux, 0para execuções bem-sucedidas e 1ou superior para execuções com falha.

Premraj
fonte
3
Esta resposta parece em contradição com @ de Robert resposta
amdev
Ele não mencionou no documento java que o código de saída -1 representa ERRO. Em vez disso, o texto é "status - Status de término. Por convenção, um código de status diferente de zero indica término anormal".
Damith
EXIT_*não existe em Java.
Juanchito
6

exit(0)geralmente usado para indicar um encerramento bem-sucedido. exit(1)ou exit(-1)ou qualquer outro valor diferente de zero indica rescisão malsucedida em geral.

Purushottam Sadh
fonte
O que me atrapalha é que o argumento é passado pelo codificador. Não há um valor de retorno pelo método. Como ele pode indicar o resultado da finalização?
anKotliner
4

Aqui está a resposta.

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
Lova Chittumuri
fonte
2

Uma boa dica é que qualquer código de erro> 255 será convertido para o código de erro% 256. Deve-se ter cuidado especial com isso se estiverem usando um código de erro personalizado> 255 e esperando o código de erro exato na lógica do aplicativo. http://www.tldp.org/LDP/abs/html/exitcodes.html

nômade
fonte
1

a diferença dos números colocados em system.exit () é explicada em outras respostas. mas a DIFERENÇA REAL é que System.exit () é um código que é retornado ao processo de chamada. Se o programa estiver sendo chamado pelo sistema operacional, o código de retorno dirá ao sistema operacional que, se system.exit () retornou 0, tudo estava ok, mas se algo não der errado, pode haver alguns manipuladores para isso no processo pai

parsa
fonte
0

Como outros respondem 0significando sucesso, caso contrário.

Se você usar o arquivo bat (janela), isso System.exit(x)será efetivado.

Código java (myapp):

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

}

arquivo bat:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --
nguyên
fonte
-2

System.exit (0) por convenção, um código de status diferente de zero indica encerramento anormal.

System.exit (1) - Significa que a finalização não foi bem-sucedida devido a algum erro

androminor
fonte
O argumento sempre 'serve como um código de status'. Não apenas quando é zero.
Marquês de Lorne #
Ai sim . desculpe meu EJP ruim
androminor 4/17
-6
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); 
}

}

No código acima, quando seu System.exit (0); e quando pressiono o caso 5, ele sai corretamente, mas quando uso System.exit (1); e pressione o caso 5, ele sai com erro e, novamente, quando eu tento o caso 15, sai corretamente por isso, eu sei que, sempre que colocamos algum argumento interno, especifica isso, ele pega o caractere dessa posição, ou seja, se eu colocar (4) que significa pegar o quinto caractere dessa string se for (3), então significa pegar o 4º caractere daquela string inserida

LEGEND MORTAL
fonte