197 votes

Quand devrions-nous appeler System.exit en Java

En Java, quelle est la différence avec ou sans System.exit(0) dans le code suivant?

 public class TestExit
{      
    public static void main(String[] args)
    { 
        System.out.println("hello world");

        System.exit(0);  // is it necessary? And when it must be called? 
    }      
}
 

Le document dit: "Cette méthode ne retourne jamais normalement." Qu'est-ce que ça veut dire?

215voto

Joonas Pulakka Points 20361

System.exit() peut être utilisé pour exécuter l'arrêt de crochets avant que le programme se ferme. C'est un moyen pratique de gérer l'extinction dans les grands programmes, où toutes les parties du programme ne peut pas (et ne devrait pas) être conscients de chaque autres. Ensuite, si quelqu'un veut arrêter, il suffit d'appeler System.exit(), et à l'arrêt des crochets (si elle est correctement configuré) prenez soin de faire tout le nécessaire de l'arrêt de cérémonies telles que la fermeture des fichiers, en libérant les ressources etc.

"Cette méthode ne retourne jamais normalement." signifie simplement que la méthode ne reviennent pas; une fois qu'un thread y va, il ne reviendra pas.

Un autre, peut-être plus courante, pour quitter un programme, c'est tout simplement d'arriver à la fin de l' main méthode. Mais alors vous avez besoin d'un autre moyen (par rapport à l'arrêt crochets) pour arrêter tous les non-fils de démon et la libération d'autres ressources (sauf si vous avez un thread).

Pour certains, la raison de l'arrêt des crochets semble être un sous-évalué et mal compris le mécanisme, et les gens sont en train de réinventer la roue avec tous les types de propriétaires sur mesure les hacks de quitter leurs programmes. Je voudrais encourager l'utilisation de l'arrêt de crochets; tout y est dans la norme d'Exécution que vous allez utiliser de toute façon.

50voto

Jon Skeet Points 692016

Dans ce cas, il n'est pas nécessaire. Pas de supplément de threads ont été mis en place, vous ne modifiez pas le code de sortie (qui est par défaut à 0) - en gros, c'est inutile.

Quand les docs dire que la méthode ne retourne jamais normalement, cela signifie que la ligne suivante de code est effectivement inaccessible, même si le compilateur ne sait pas que:

System.exit(0);
System.out.println("This line will never be reached");

Une exception sera levée, ou la machine virtuelle sera résilié avant de retourner. Il ne sera jamais "juste retour".

Il est très rare pour être la peine d'appeler System.exit() IME. Il peut faire sens que si vous écrivez un outil de ligne de commande, et que vous souhaitez indiquer une erreur via le code de sortie plutôt qu'en lançant une exception... mais je ne me souviens pas la dernière fois que je l'ai utilisé dans le cours normal de la production de code.

15voto

mico Points 703

La méthode ne retourne jamais parce que c'est la fin du monde, et aucun de votre code va être en attente.

Votre demande de sortie de toute façon au même endroit dans le code, mais vous avez la possibilité de retourner un code personnalisé à l'environnement, comme dans

System.exit(42);

Qui va faire usage de votre code de sortie? Un script qui appelle l'application. Fonctionne sous Windows, Unix et tous les autres scripts environnements.

Pourquoi retourner un code? De dire des choses comme "je n'ai pas succeeed", "La base de données n'a pas de réponse".

14voto

Qwerky Points 10847

System.exit(0) met fin à la JVM. Dans de simples exemples comme cela, il est difficile de percevoir la différence. Le paramètre est passé à l'OS et qui est normalement utilisé pour indiquer un arrêt anormal (par exemple, une sorte d'erreur fatale), donc si vous l'avez appelé java à partir d'un fichier de commandes ou shell script, vous seriez en mesure d'obtenir cette valeur et se faire une idée si la demande a été acceptée.

Il ferait un très un impact si vous avez appelé, System.exit(0) sur une application déployée sur un serveur d'applications (pensez-y avant de vous essayer).

5voto

mfx Points 4517

System.exit est nécessaire

  • quand vous voulez retourner un code d'erreur non 0
  • quand vous voulez quitter votre programme depuis un endroit qui n'est pas le principal ()

Dans votre cas, il fait exactement la même chose que le simple retour de main.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X