2009-02-12 9 views
55

Dans le cas de langages avec une syntaxe C-like, nous déclarons que la méthode main() renvoie une valeur int ou float (ou void). Est-il possible de déclarer un type de retour non-void de main() en Java? Si non, alors pourquoi pas? Cela signifie-t-il qu'un programme Java ne renvoie aucune valeur au système d'exploitation?Pourquoi main() dans java est-il vide?

+4

Dans quelle langue 'main' renvoie-t-il une valeur à virgule flottante? –

+0

Comme l'indique la première réponse à cette question, il y a une raison technique à cela, donc ce n'est pas principalement une opinion. – Raedwald

Répondre

7

Vous pouvez renvoyer un int avec System.exit().

Renvoyer autre chose qu'un entier n'a pas beaucoup de sens, car le système d'exploitation attend un nombre entier. Si rien n'est renvoyé, la valeur par défaut est 0, ce qui signifie OK. D'autres valeurs sont généralement utilisées pour signaler des erreurs ou des conditions spéciales.

27

This est une discussion intéressante sur velocityreviews sur le même sujet:

Highlight:

Soit dit en passant, cela est considéré comme un mauvais style en C et C++ juste parce que c'est la mauvaise signature pour principale , pas pour une raison universelle indépendante des langages de programmation. C'est une de ces choses qui n'est pas vraiment supposée fonctionner, mais qui pourrait être mise en œuvre.

En Java, la raison principale renvoie void est les threads. C et C++ étaient tous les deux conçus comme langages avant que multithread soit une technique largement connue , et tous les deux avaient des fils greffés sur eux à une date ultérieure. Java a été conçu dès le départ pour être un environnement multithread, et franchement, il serait inhabituel d'écrire une application Java non triviale qui n'utilise pas plus d'un thread. Donc, l'idée qu'un programme se déplace linéairement du début à la fin de la ligne principale est un peu obsolète.

écrit par

www.designacourse.com La meilleure façon de former toute ... Anywhere. Chris Smith - Lead Software Developer/Technical Trainer MindIQ Corporation

66

La méthode main() doit en effet avoir un type void de retour. De l'Java Language Specification sur "Exécution - machine virtuelle de démarrage" (§12.1.4):

La méthode main doit être déclarée public, static et void. Il doit accepter un seul argument qui est un tableau de chaînes .

Il décrit ensuite lorsqu'un programme se termine en « exécution - Programme de sortie » (§12.8):

Un programme met fin à toutes ses activités et sorties lorsque l'une des deux choses arrive :

  • Tous les threads qui ne sont pas se terminent.
  • Certains fil appelle la méthode exit de classe Runtime ou classe System et l'opération de sortie est pas interdit par le responsable de la sécurité .

En d'autres termes, le programme peut quitter avant ou après la fin de la méthode main; une valeur de retour de main serait donc dénuée de sens. Si vous voulez que le programme pour retourner un code d'état, appelez l'une des méthodes suivantes (notez que les trois méthodes ne reviennent jamais normalement):

Parmi les trois, System.exit() est le moyen conventionnel et le plus pratique pour terminer la JVM.

22

La raison de la méthode main ayant void comme type de retour est que, une fois que main a terminé, cela ne signifie pas nécessairement que l'ensemble du programme est terminé. Si main génère de nouveaux threads, ces threads peuvent continuer à exécuter le programme. Le type de retour de main n'a pas beaucoup de sens à ce stade. Par exemple, cela est très courant dans les applications Swing, où la méthode main démarre généralement une interface graphique sur le thread Swing, puis main se termine ... mais le programme est toujours en cours d'exécution.

+0

Peter, pourriez-vous clarifier pour moi-même (en cours d'exploration java multithreading) ... Est-ce que ce sont des threads Deamon SEULEMENT qui ne sont pas autorisés à survivre main()? – Max

+5

@Max: non, la méthode main() n'a aucun contrôle sur la machine virtuelle Java. Lorsque JVM démarre, il exécute la méthode main(), mais lorsque main() se termine, cela ne signifie pas que les terminaisons JVM. JVM continue à exécuter tous les threads jusqu'à ce que 1) Runtime.exit() soit appelé OU 2) tous les threads normaux (pas daemon) sont morts. Les threads démon ne comptent pas pour cette seconde condition. En d'autres termes ... si la méthode main() engendre des threads normaux, la JVM ne s'arrêtera pas ** ** à la fin de main(). Si main() ne génère aucun thread, JVM se terminera.Si main() n'engendre que des threads de démon, JVM se terminera également lorsque main() se terminera. –

+0

Pete, merci pour clarif. – Max