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?
Répondre
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.
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
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éepublic
,static
etvoid
. 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 classeRuntime
ou classeSystem
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):
System.exit(int status)
- équivalent àRuntime.getRuntime().exit(status)
Runtime.exit(int status)
- Met fin à la machine virtuelle Java en cours d'exécution en initiant sa séquence d'arrêt (exécuter tous les enregistrements shutdown hooks et uninvoked finalizers, si nécessaire). Une fois cela fait, la JVM s'arrête.Runtime.halt(int status)
- Termine de force la JVM en cours d'exécution.
Parmi les trois, System.exit()
est le moyen conventionnel et le plus pratique pour terminer la JVM.
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.
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
@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. –
Pete, merci pour clarif. – Max
- 1. Pourquoi int main() {} compile?
- 2. C++ classe pourquoi besoin de main?
- 3. Analyser java main args [] erreurs de tableau
- 4. XmlNodeList (pourquoi est-ce vide)
- 5. Java Liste avec vide autorisé
- 6. Pourquoi mon CommandArgument est-il vide?
- 7. Pourquoi bitmapImageRepForCachingDisplayInRect: créer une image vide?
- 8. Pourquoi ma collection UserProperties est-elle vide?
- 9. Pourquoi 1 $ est-il vide dans ma substitution?
- 10. Java URL Connection flux d'entrée vide
- 11. Main principale à WinCE principal
- 12. courte main instruction if
- 13. Pourquoi n'y a-t-il pas de fonction main() dans vxWorks?
- 14. Omaha Salut main Evaluator
- 15. Modèle vide, table vide
- 16. iPhone façonné à la main vues/contrôleurs
- 17. Pourquoi le contenu de l'iframe est-il vide?
- 18. Boost :: Test - génération de Main()?
- 19. Pourquoi java -version renvoie l'ancienne version?
- 20. Pourquoi mon contenu iframe est-il entouré d'une zone vide?
- 21. ASP.NET: Pourquoi "_requestValueCollection" est-il vide sur PostBack?
- 22. Séquence vide dans LINQ
- 23. Structure vide dans C
- 24. Ajout de void main() wpf
- 25. MATLAB: Pourquoi résoudre retourne-t-il un objet sym vide?
- 26. Pourquoi la chaîne vide ne correspond-elle pas à Seq.empty?
- 27. Détection de l'exécution dans Main Thread dans la bibliothèque C#
- 28. Pourquoi ma date MySQL est-elle vide en PHP?
- 29. Pourquoi une application WPF vide consomme-t-elle 50 Mo?
- 30. Pourquoi cette requête Nhibernate renvoie-t-elle une liste vide?
Dans quelle langue 'main' renvoie-t-il une valeur à virgule flottante? –
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