Pourquoi la méthode principale en Java a-t-elle toujours besoin d'arguments?

Pourquoi la méthode principale en Java a-t-elle toujours besoin d'arguments? Pourquoi devrions-nous écrire String[] args à chaque fois, au lieu de simplement l'écrire Lorsque nous utilisons des arguments?

Une méthode comme celle-ci génère Main method not found Erreur du compilateur. Puisque nous n'utilisons jamais d'arguments à la méthode principale, cela devrait être autorisé.

public static void main()
{
}

Ce n'est pas une question d'entrevue. Il est juste venu à mon esprit au moment de la programmation.

22
demandé sur Palec 2012-05-28 14:34:58

8 réponses

Fondamentalement, il y a quatre réponses:

  1. Parce que c'est comme ça qu'il a été conçu. Oui, je sais que c'est une raison circulaire. Mais le fait est que c'est comme ça et que ça ne va pas changer. Donc, à moins que vous envisagiez de concevoir votre propre langue, la question Est Sans objet.

  2. Propreté de la conception (aka le principe sec). Ne spécifiez pas deux signatures de point d'entrée quand on peut faire le travail. Et clairement, c'est possible.

  3. Simplicité sémantique. Supposons (hypothétiquement) que Java a pris en charge les points d'entrée void main(String[]) et void main(). Que se passerait-il si une classe définissait les deux méthodes? Est qu'une erreur? Sinon, lequel a préséance en cas d'ambiguïté? Est-ce confus encore?

    En autorisant seulement void main(String[]), le JLS évite le problème.

  4. Ceci est analogue aux signatures d'entrée C et c++ standard. (Certes, certains runtimes c / c++ prennent également en charge d'autres points d'entrée non standard ... mais c'est pas exactement une bonne chose ... OMI.)

Rien de tout cela ne signifie qu'il aurait été sans ambiguïté tort de le faire d'une autre manière. Et par exemple C# vous donne des signatures alternatives, et traite le problème d'ambiguïté en exigeant que le développeur désigne un point d'entrée d'une autre manière.

FWIW, cette page wikipedia décrit la méthode "principale" dans un certain nombre de langues.

30
répondu Stephen C 2012-05-28 11:29:53

Parce que l'outil java qui exécute l'application recherche un main avec une signature spécifique, donc il sait qu'il appelle le bon. Java a une surcharge de méthode, donc lorsque vous recherchez une méthode, vous devez spécifier une signature assez complète. Certes, l'outil java pourrait faire quelque chose de plus complexe (recherchez la signature spécifique et, ne l'ayant pas trouvée, recherchez main et appelez-la s'il n'en trouve qu'une), mais ce n'est pas ce que les concepteurs Java ont décidé de faire (et subjectivement , FWIW, je pense que c'est pour le mieux-gardez-le simple).

Vous pouvez trouver les détails dans la spécification du langage Java, Chapitre 12: exécution. Et notez que lorsque Java a obtenu des listes d'arguments variables, il est devenu possible de déclarer main de deux manières différentes:

public static void main(String[] args)
// or
public static void main(String... args)
5
répondu T.J. Crowder 2012-05-28 10:41:41

Lorsque JVM commence à exécuter le programme java, elle recherche la méthode principale ayant cette signature (c'est-à-dire le tableau de chaînes)

0
répondu Android Killer 2012-05-28 10:38:30

C'est juste la façon dont ils l'ont conçu. Corollaire à cela, vous pourriez vous demander pourquoi son cousin (C#) permet la méthode principale avec ou sans paramètres, c'est juste la façon dont ils l'ont conçu.

Il n'y a pas de raison sérieuse là-bas, chaque concepteur de langue ont leurs préférences quels principes vous devez souscrire. Parfois, c'est à nous de déduire, ou d'adhérer à(parfois, nous ne pouvons pas obtenir les choses à notre façon) pour l'intervalle.

Hmm... cela me rappelle le système d'exploitation que j'utilise maintenant. Avant OS X Lion, vous ne pouvez redimensionner que dans le coin inférieur droit de la fenêtre. C'est plus de 28 ans d'attente avant qu'ils ne mettent enfin la capacité de redimensionner dans les coins de n'importe quelle fenêtre de leur système d'exploitation.

Même si J'aime trop Mac OS, Je ne sortirais pas pour défendre leur position avant qu'une fenêtre ne soit redimensionnable sur un seul coin. Le zélotisme est une chose, mais l'adhésion aveugle en est une autre.

Il est donc bon que vous pratiquiez la pensée critique et ne croyiez pas aveuglément que la signature de la méthode principale de Java est la seule bonne façon


Une digression, en attendant que Mac ait des bords redimensionnables à n'importe quel coin, s'apparente à moi en attendant que Java ait une propriété de première classe. Malgré le nom JSON (Java script Object Notation, bien que bien sûr Javascript N'est pas Java), C # object initializer (via son initialiseur de propriété et initialiseur de collection) a plus d'affinité avec JSON par rapport à Java object initializer avec JSON. C # object initializer est très soigné et étroitement ressembler à JSON.

C #

var p = new {
    Lastname = "Lennon",
    Firstname = "John",
    PlacesBeen = 
        new[]
        {
            new { City = "Liverpool", Country = "England" },
            new { City = "New York", Country = "US" },
            new { City = "Tokyo", Country = "Japan" }
        }
};

return Json(p);

Javascript:

var p = {
    "Lastname" : "Lennon",
    "Firstname" : "John",
    "PlacesBeen" :             
        [
            { "City" : "Liverpool", "Country" : "England" },
            { "City" : "New York", "Country" : "US" },
            { "City" : "Tokyo", "Country" : "Japan" }
        ]
};

Par conséquent, avec la propriété de première classe de C#(pas shoehorned to method) et l'initialiseur de collection, non seulement le code devient concis et soigné, mais il ressemble maintenant à ce que la plupart des développeurs utilisent maintenant pour le format d'échange de données, c'est-à-dire JSON.

La syntaxe d'initialisation D'objet de Java est loin du style JSON. Je ne défendrai pas la décision de conception de Java(par exemple, la syntaxe de propriété/conception) à cet égard : -)

Donc là, dans la même veine que je ne défendrai pas la décision de conception du concepteur de langage Java sur la syntaxe/conception de la propriété de Java, Je ne défendrai pas public static void main(String[] args)

0
répondu Michael Buen 2012-05-28 13:44:42

Lorsque vous essayez d'exécuter un programme java, JVM recherchera la méthode principale avec string array comme argument pour démarrer l'exécution du programme à partir de là. Comme la méthode qui vous est donnée n'est pas avec cette signature, elle déclenchera une exception Aucune méthode principale trouvée

-1
répondu Chandra Sekhar 2012-05-28 10:39:40

Je pense que Java a "copié" cette habitude à partir de c / C++, et codé en dur en java.c:

  /* Get the application's main method */
  mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
                                     "([Ljava/lang/String;)V");
  if (mainID == NULL) {
      if ((*env)->ExceptionOccurred(env)) {
          ReportExceptionDescription(env);
      } else {
        message = "No main method found in specified class.";
        messageDest = JNI_TRUE;
      }
      goto leave;
  }
-1
répondu Hatter Jiang 2012-05-28 10:40:30

Java est conçu de cette manière. si nous n'écrivons pas d'args de chaîne [], alors le programme sera compilé mais il ne sera pas exécuté.

-1
répondu user2957029 2013-11-05 15:57:57

Il se peut que la plupart des entrées proviennent de l'extérieur de main () comme des arguments de ligne de commande, donc pour attraper ces valeurs, il a une signature String[]args.

-1
répondu Prateek Bajpai 2015-09-24 04:25:40