System.exit()
peut être utilisé pour exécuter des hooks d'arrêt avant la fermeture du programme. C'est un moyen pratique de gérer l'arrêt des programmes plus volumineux, où toutes les parties du programme ne peuvent pas (et ne devraient pas) se connaître les unes les autres. Ensuite, si quelqu'un veut quitter, il peut simplement appeler System.exit()
, et les hooks d'arrêt (s'ils sont correctement configurés) se chargent de faire toutes les cérémonies d'arrêt nécessaires telles que la fermeture de fichiers, la libération de ressources, etc.
"Cette méthode ne revient jamais normalement." signifie simplement que la méthode ne reviendra pas; une fois qu'un fil y va, il ne reviendra pas.
Une autre façon, peut-être plus courante, de quitter un programme consiste simplement à atteindre la fin de la main
méthode. Mais si des threads non démon sont en cours d'exécution, ils ne seront pas arrêtés et la JVM ne se fermera donc pas. Ainsi, si vous avez de tels threads non démon, vous avez besoin d'un autre moyen (que les hooks d'arrêt) pour arrêter tous les threads non démon et libérer d'autres ressources. S'il n'y a pas d'autres threads non démon, le retour de main
fermera la JVM et appellera les hooks d'arrêt.
Pour une raison quelconque, les crochets d'arrêt semblent être un mécanisme sous-évalué et mal compris, et les gens réinventent la roue avec toutes sortes de hacks personnalisés propriétaires pour quitter leurs programmes. J'encourage l'utilisation de crochets d'arrêt; tout est là dans le Runtime standard que vous utiliserez de toute façon.
Runtime.getRuntime().halt()
)Dans ce cas, ce n'est pas nécessaire. Aucun thread supplémentaire n'aura été démarré, vous ne modifiez pas le code de sortie (qui est par défaut 0) - en gros, c'est inutile.
Lorsque les documents indiquent que la méthode ne retourne jamais normalement, cela signifie que la ligne de code suivante est effectivement inaccessible, même si le compilateur ne sait pas que:
Soit une exception sera levée, soit la VM s'arrêtera avant de revenir. Il ne "reviendra jamais".
Il est très rare de mériter d'appeler
System.exit()
IME. Cela peut être logique si vous écrivez un outil de ligne de commande et que vous souhaitez indiquer une erreur via le code de sortie plutôt que de simplement lancer une exception ... mais je ne me souviens pas de la dernière fois que je l'ai utilisé dans le code de production normal .la source
System.exit()
ne se terminera jamais normalement - il se terminera toujours soit avec une exception, soit avec l'arrêt de la machine virtuelle (ce qui n'est pas vraiment couvert dans le JLS).La méthode ne revient jamais car c'est la fin du monde et aucun de votre code ne sera exécuté ensuite.
Votre application, dans votre exemple, quitterait quand même au même endroit dans le code, mais, si vous utilisez System.exit. vous avez la possibilité de retourner un code personnalisé à l'environnement, comme, par exemple,
Qui va utiliser votre code de sortie? Un script qui a appelé l'application. Fonctionne sous Windows, Unix et tous les autres environnements scriptables.
Pourquoi retourner un code? Pour dire des choses comme "Je n'ai pas réussi", "La base de données n'a pas répondu".
Pour voir comment obtenir la valeur d'un code de sortie et l'utiliser dans un script shell unix ou un script cmd windows, vous pouvez vérifier cette réponse sur ce site
la source
System.exit(0)
met fin à la JVM. Dans des exemples simples comme celui-ci, il est difficile de percevoir la différence. Le paramètre est renvoyé à l'OS et est normalement utilisé pour indiquer une fin anormale (par exemple une sorte d'erreur fatale), donc si vous appelez java à partir d'un fichier batch ou d'un script shell, vous pourrez obtenir cette valeur et vous faire une idée si la demande a réussi.Cela aurait un impact considérable si vous appeliez
System.exit(0)
une application déployée sur un serveur d'applications (pensez-y avant de l'essayer).la source
Dans les applications qui peuvent avoir des hooks d'arrêt complexes, cette méthode ne doit pas être appelée à partir d'un thread inconnu.
System.exit
ne se termine jamais normalement car l'appel sera bloqué jusqu'à la fin de la JVM. C'est comme si le code en cours d'exécution avait la prise d'alimentation tirée avant de pouvoir terminer. L'appelSystem.exit
lancera les hooks d'arrêt du programme et le thread quiSystem.exit
bloquera les appels jusqu'à la fin du programme. Cela implique que si le hook d'arrêt soumet à son tour une tâche au thread à partir duquel il aSystem.exit
été appelé, le programme se bloquera.Je gère cela dans mon code avec les éléments suivants:
la source
Bien que la réponse ait été vraiment utile, mais certains ont manqué de détails supplémentaires. J'espère que ci-dessous aidera à comprendre le processus d'arrêt en java, en plus de la réponse ci-dessus:
PS: La JVM peut s'arrêter de manière ordonnée ou abrupte .
la source
Il ne faut JAMAIS appeler
System.exit(0)
pour ces raisons:Quitter le programme "normalement" fournit le même code de sortie au système d'exploitation car
System.exit(0)
il est donc redondant.Si votre programme ne peut pas quitter "normalement", vous avez perdu le contrôle de votre développement [conception]. Vous devez toujours avoir un contrôle total sur l'état du système.
Soit dit en passant: le retour d'autres codes de retour que 0 est logique si vous souhaitez indiquer la fin anormale d'un programme.
la source
System.exit est nécessaire
Dans votre cas, il fait exactement la même chose que le simple retour de main.
la source
exit
votre seule option.exit
. Pas la seule option, mais certainement une option à considérer.La spécification du langage Java dit que
Cela signifie que vous devez l'utiliser lorsque vous avez un gros programme (enfin, au moins plus gros que celui-ci) et que vous souhaitez terminer son exécution.
la source
Si vous avez un autre programme en cours d'exécution dans la JVM et que vous utilisez System.exit, ce deuxième programme sera également fermé. Imaginez par exemple que vous exécutez un travail java sur un nœud de cluster et que le programme java qui gère le nœud de cluster s'exécute dans la même JVM. Si le travail utilisait System.exit, non seulement il quitterait le travail, mais également "arrêterait le nœud complet". Vous ne pourriez pas envoyer un autre travail à ce nœud de cluster car le programme de gestion a été fermé accidentellement.
Par conséquent, n'utilisez pas System.exit si vous souhaitez pouvoir contrôler votre programme à partir d'un autre programme java au sein de la même machine virtuelle Java.
Utilisez System.exit si vous souhaitez fermer la JVM complète à dessein et si vous souhaitez profiter des possibilités qui ont été décrites dans les autres réponses (par exemple, arrêter les hooks: Java shutdown hook , valeur de retour non nulle pour la ligne de commande) appels: comment obtenir l'état de sortie d'un programme Java dans un fichier batch Windows ).
Jetez également un œil à Exceptions Runtime: System.exit (num) ou lancer une RuntimeException à partir de main?
la source