program - Quand devrions-nous appeler System.exit en Java




java system.exit(0) example (7)

Bien que la réponse était vraiment utile, mais certains ont manqué quelques 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:

  1. Lors d'une fermeture ordonnée *, la JVM démarre d'abord tous les hooks d'arrêt enregistrés. Les hooks d'arrêt sont des threads non démarrés qui sont enregistrés avec Runtime.addShutdownHook.
  2. JVM ne donne aucune garantie sur l'ordre dans lequel les hooks d'arrêt sont démarrés. Si des threads d'application (daemon ou nondaemon) sont toujours en cours d'exécution à l'arrêt, ils continuent de s'exécuter simultanément avec le processus d'arrêt .
  3. Lorsque tous les hooks d'arrêt sont terminés, la JVM peut choisir d'exécuter les finaliseurs si runFinalizersOnExit a la valeur true, puis s'arrête.
  4. JVM ne tente pas d'arrêter ou d'interrompre les threads d'application qui sont toujours en cours d'exécution au moment de l'arrêt; ils sont brusquement terminés quand la JVM finit par s'arrêter.
  5. Si les crochets d'arrêt ou les finaliseurs ne se terminent pas, le processus d'arrêt ordonné "se bloque" et la JVM doit être arrêtée brusquement.
  6. Dans un arrêt brusque, la JVM n'est pas obligée de faire autre chose que de stopper la JVM; les crochets d'arrêt ne fonctionneront pas.

PS: La JVM peut s'arrêter de manière ordonnée ou abrupte .

  1. Une fermeture ordonnée est déclenchée lorsque le dernier thread "normal" (non-démon) se termine, quelqu'un appelle System.exit, ou par d'autres moyens spécifiques à la plate-forme (comme envoyer un SIGINT ou appuyer sur Ctrl-C).
  2. Tandis que ci-dessus est le moyen standard et préféré pour arrêter la JVM, il peut également être arrêté brutalement en appelant Runtime.halt ou en supprimant le processus JVM via le système d'exploitation (comme l'envoi d'un SIGKILL).

https://code.i-harness.com

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 revient jamais normalement." Qu'est-ce que ça veut dire?


Dans ce cas, ce n'est pas nécessaire. Aucun thread supplémentaire n'aura été démarré, vous ne changerez pas le code de sortie (qui est par défaut à 0) - fondamentalement, c'est inutile.

Lorsque les docs disent que la méthode ne revient jamais normalement, cela signifie que la ligne de code suivante 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 se terminera avant de revenir. Il ne reviendra jamais "juste".

Il est très rare d'appeler System.exit() IME. Cela peut sembler logique si vous écrivez un outil de ligne de commande, et vous voulez indiquer une erreur via le code de sortie plutôt que de simplement lancer une exception ... mais je ne me souviens plus la dernière fois que je l'ai utilisé dans le code de production normal .


Il ne faut JAMAIS appeler System.exit (0).

  1. C'est un "goto" caché, et "gotos" casse le flux de contrôle. S'appuyer sur des crochets dans ce contexte est une cartographie mentale que chaque développeur de l'équipe doit connaître.
  2. Quitter le programme "normalement" fournira le même code de sortie au système d'exploitation que System.exit (0). Donc c'est redondant. Si votre programme ne peut pas quitter "normalement", votre développement est hors de contrôle. Vous devriez toujours avoir le contrôle total de l'état du système.
  3. Vous masquez les problèmes de programmation tels que l'exécution de threads qui ne sont pas arrêtés normalement.
  4. Cela fait référence à 3: Vous pouvez rencontrer un état d'application inconstant qui interrompt les threads anormalement.

En passant: Le renvoi d'autres codes de retour à 0 a un sens si vous voulez indiquer une fin de programme anormale.


La méthode ne revient jamais car c'est la fin du monde et aucun de vos codes 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, disons

System.exit(42);

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 Windows cmd, vous pouvez vérifier cette réponse sur ce site


System.exit est nécessaire

  • lorsque vous voulez renvoyer un code d'erreur non-0
  • quand vous voulez quitter votre programme d'un endroit qui n'est pas principal ()

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


Java Language Specification dit que

Sortie du programme

Un programme termine toute son activité et se termine lorsque l'une des deux choses suivantes se produit:

Tous les threads qui ne sont pas des threads démon se terminent.

Un thread appelle la méthode exit de la classe Runtime ou class System et l'opération exit n'est pas interdite par le gestionnaire de sécurité.

Cela signifie que vous devriez l'utiliser quand vous avez un gros programme (enfin, au moins plus gros que celui-ci) et que vous voulez terminer son exécution.


System.exit(0) termine la JVM. Dans des exemples simples comme celui-ci, il est difficile de percevoir la différence. Le paramètre est renvoyé au système d'exploitation et est normalement utilisé pour indiquer une terminaison 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 si l'application a réussi

Cela aurait un impact considérable si vous System.exit(0) sur une application déployée sur un serveur d'applications (pensez-y avant de l'essayer).





exit