Différence de système. exit (0), System.exit (-1), System.exit (1) en Java

280

Je voudrais connaître la différence entre les éléments suivants en Java

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

Quand dois-je utiliser le code ci-dessus de manière appropriée?

giri
la source
17
pourquoi n'avez-vous pas marqué la réponse comme la «meilleure réponse» donc il y a une coche verte? ça aide les autres à savoir quel est le meilleur !!
Saksham Goyal

Réponses:

253

Le paramètre de sortie doit être qualifié si l'exécution du programme s'est bien déroulée. C'est une sorte d'hérédité des anciens langages de programmation où il est utile de savoir si quelque chose s'est mal passé et ce qui s'est mal passé.

Le code de sortie est

  • 0 quand l'exécution s'est bien passée;
  • 1, -1, whatever != 0Quand une erreur est survenue, vous pouvez utiliser des valeurs différentes pour différents types d'erreurs.

Si je suis correct, les codes de sortie n'étaient que des nombres positifs (je veux dire sous UNIX) et selon la plage:

  • 1-127sont des codes définis par l'utilisateur (donc générés par l'appel exit(n))
  • 128-255sont des codes générés par la terminaison en raison de différents signaux Unix comme SIGSEGV ou SIGTERM

Mais je ne pense pas que vous devriez vous soucier du codage sur Java, c'est juste un peu d'information. C'est utile si vous prévoyez de faire interagir vos programmes avec des outils standard.

Jack
la source
31
Notez également qu'un code de sortie de 0 compte comme vrai dans le shell et que tout autre code compte comme faux. Il java MyApp && echo successaffichera donc "succès" si MyApp a un code de sortie de 0, c'est-à-dire s'il appelle exit(0)ou atteint simplement la fin de la méthode principale sans erreur.
sepp2k
16
Veuillez toujours prendre soin du code de sortie si votre application peut être utilisée dans un script. Il est très ennuyeux de voir un outil échouer en silence au milieu de votre script (ou imprimer une trace de pile et sortir avec 0).
Doncho Gunchev
6
Une chose à noter: lors du retour de -1, le plus grand nombre positif possible est renvoyé dans un contexte non signé (dans la représentation du complément à deux, -1 définit toujours tous les bits quel que soit le nombre d'octets dans le nombre). Ainsi, -1 est généralement renvoyé lorsque vous renvoyez une erreur non spécifique et que vous ne voulez pas qu'elle se heurte à des codes d'erreur possibles qui sont déjà définis et documentés. Par exemple, le code d'erreur 1 peut avoir été documenté comme une erreur d'écriture; le code d'erreur 2 peut être lu, etc.
Nylon Smile
Il s'agit en fait d'une «sorte d'hérédité» de la sortie (2) d'Unix.
Marquis de Lorne
127

Zero => Tout va bien

Positive => Quelque chose que j'attendais pourrait potentiellement mal tourner a mal tourné (mauvaise ligne de commande, impossible de trouver le fichier, impossible de se connecter au serveur)

Negative=> Quelque chose que je n'attendais pas du tout s'est mal passé (erreur système - exception imprévue - arrêt forcé externe par exemple kill -9)

(les valeurs supérieures à 128 sont en fait négatives, si vous les considérez comme un binaire signé 8 bits ou un complément à deux)

Il y a plein de bons codes de sortie standard ici

robert
la source
12
«Quelque chose que je pensais mal tourner s'est mal passé» sonne comme «Tout va bien».
tobe
"On peut raisonnablement s'attendre à ce que moi, en tant que développeur, anticipiez" Erreur utilisateur vs erreur système; Ceci est en fait couvert par l'affiche du haut: les valeurs 128-255 sont des binaires signés -ve wrt 8 bits.
robert
6
@tobe C'est vraiment plus comme "Quelque chose que j'attendais pourrait mal tourner s'est mal passé";)
Marcel Hernandez
1
Bash traite les codes de sortie comme non signés 8 bits, et modifie 256, donc un -1 devient 255 et 256 devient 0. Les signaux (dans un kill, par exemple kill -15) entraînent souvent un code de sortie 128+signal, mais (à part 9) peuvent être gérés et retourner un code de sortie différent. L' -en kill -15est marque le numéro comme un signal et non un pid, il ne fait pas le négatif du signal.
Matthew
Lorsque vous le faites System.exit(-1), puis dans votre shell, echo $?vous obtenez «255». C'est pourquoi j'ai dit que les nombres négatifs sont des erreurs système, pas à cause du «-» dans le paramètre kill. Pensiez-vous sérieusement que c'est ce que je pensais? Mais merci d'avoir expliqué le mécanisme par lequel Bash construit ces codes.
robert
51

System.exit(system call)met fin à la machine virtuelle Java en cours d'exécution en lançant sa séquence d'arrêt. L'argument sert de code d'état .

Par convention, un code d'état différent de zéro indique une fin anormale.

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

En savoir plus sur Java

Sur les systèmes Unix et Linux, 0pour les exécutions réussies et 1ou plus pour les exécutions échouées.

Premraj
la source
3
Cette réponse semble en contradiction avec la réponse de @ robert
amdev
Il n'a pas mentionné dans le document java que le code de sortie -1 représente une ERREUR à la place, le libellé est "état - état de terminaison. Par convention, un code d'état différent de zéro indique une terminaison anormale".
Damith
EXIT_*n'existe pas en Java.
juanchito
6

exit(0)généralement utilisé pour indiquer une résiliation réussie. exit(1)ou exit(-1)ou toute autre valeur non nulle indique une résiliation infructueuse en général.

Purushottam Sadh
la source
Ce qui me co-fusionne, c'est que l'argument est passé par le codeur. Pas une valeur de retour par la méthode. Comment peut-il indiquer le résultat de la terminaison?
anKotliner
4

Voici la réponse.

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
la source
2

Un bon problème est que tout code d'erreur> 255 sera converti en code d'erreur% 256. Il faut être particulièrement prudent à ce sujet s'ils utilisent un code d'erreur personnalisé> 255 et attendent le code d'erreur exact dans la logique d'application. http://www.tldp.org/LDP/abs/html/exitcodes.html

nomade
la source
1

la différence des nombres mis dans system.exit () est expliquée dans d'autres réponses. mais la VRAIE DIFFÉRENCE est que System.exit () est un code qui est renvoyé au processus d'appel. Si le programme est invoqué par le système d'exploitation, le code de retour indiquera au système d'exploitation que si system.exit () a renvoyé 0, tout était correct, mais si quelque chose n'allait pas, il pourrait y avoir des gestionnaires pour cela dans le processus parent.

parsa
la source
0

Comme d'autres répondent au 0succès, autrement.

Si vous utilisez le fichier bat (fenêtre), cela System.exit(x)aura un effet.

Code java (myapp):

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

}

fichier bat:

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

System.exit (0) par convention, un code d'état différent de zéro indique une fin anormale.

System.exit (1) - Cela signifie que la résiliation a échoué en raison d'une erreur

androminor
la source
L'argument «sert toujours de code d'état». Pas seulement quand il est nul.
Marquis de Lorne
Oh oui . désolé mon mauvais 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); 
}

}

Dans le code ci-dessus lorsque son System.exit (0); et lorsque j'appuie sur le boîtier 5, il se ferme correctement, mais lorsque j'utilise System.exit (1); et appuyez sur le cas 5, il sort avec erreur et à nouveau lorsque j'essaie avec le cas 15, il sort correctement par cela, j'ai appris que, chaque fois que nous mettons un argument int à l'intérieur, il spécifie que, il prend le caractère de cette position, c'est-à-dire que si je mets (4) que cela signifie prendre le 5ème caractère de cette chaîne si son (3) alors cela signifie prendre le 4ème caractère de cette chaîne entrée

LEGEND MORTAL
la source