web-dev-qa-db-fra.com

"Erreur: méthode principale introuvable dans la classe MyClass, veuillez définir la méthode principale comme ..."

Les nouveaux programmeurs Java rencontrent souvent ces messages lorsqu'ils tentent d'exécuter un programme Java.


Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Error: Main method is not static in class MyClass, please define the main method as:
   public static void main(String[] args)

Error: Main method must return a value of type void in class MyClass, please
define the main method as:
   public static void main(String[] args)

Java.lang.NoSuchMethodError: main
Exception in thread "main"

Qu'est-ce que cela signifie, qu'est-ce qui peut le causer et que faire pour le résoudre?

53
Stephen C

Lorsque vous utilisez la commande Java pour exécuter une application Java à partir de la ligne de commande, par exemple,

Java some.AppName arg1 arg2 ...

la commande charge la classe que vous avez nommée, puis recherche la méthode du point d'entrée appelée main. Plus spécifiquement, il recherche une méthode déclarée comme suit:

package some;
public class AppName {
    ...
    public static void main(String[] args) {
        // body of main method follows
        ...
    }
}

Les exigences spécifiques pour la méthode du point d’entrée sont les suivantes:

  1. La méthode doit être dans la classe désignée.
  2. Le nom de la méthode doit être "main" avec exactement cette capitalisation1.
  3. La méthode doit être public.
  4. La méthode doit être static 2.
  5. Le type de retour de la méthode doit être void.
  6. La méthode doit avoir exactement un argument et le type d'argument doit être String[] 3.

(L'argument peut être déclaré à l'aide de la syntaxe varargs; par exemple, String... args. Voir cette question pour plus d'informations. String[] argument est utilisé pour transmettre les arguments à partir de la ligne de commande et est obligatoire même si votre application ne prend aucun argument de ligne de commande.)

Si l'une des conditions ci-dessus n'est pas remplie, la commande Java échouera avec une variante du message:

Error: Main method not found in class MyClass, please define the main method as:
   public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application

Ou, si vous utilisez une ancienne version de Java extrêmement :

Java.lang.NoSuchMethodError: main
Exception in thread "main"

Si vous rencontrez cette erreur, vérifiez que vous disposez d'une méthode main et qu'elle satisfait à toutes les 6 exigences répertoriées ci-dessus.


1 - Une variation vraiment obscure de cela est quand un ou plusieurs des caractères de "main" n'est PAS un caractère LATIN-1 ... mais un caractère Unicode qui ressemble à le caractère LATIN-1 correspondant lorsqu'il est affiché.

2 - Voir Pourquoi la méthode Java main est-elle statique? == pour expliquer pourquoi la méthode doit être statique.

3 - String doit correspondre à Java.lang.String et non à une classe personnalisée nommée String le masquant.

37
Stephen C

Le problème est que vous n'avez pas de méthode public void main(String[] args) dans la classe que vous tentez d'appeler.

Il 

  • doit être static
  • doit avoir exactement un argument de tableau String (qui peut être nommé n'importe quoi)
  • doit être orthographié m-a-i-n en minuscule.

Notez que vous avez effectivement spécifié une classe existante (sinon l'erreur aurait été différente), mais cette classe n'a pas la méthode principale.

14

D'autres réponses résument bien les exigences de main. Je veux rassembler des références sur l'endroit où ces exigences sont documentées.

La source la plus fiable est la spécification VM (deuxième édition citée). main n'étant pas une fonctionnalité de langage, elle n'est pas prise en compte dans la spécification de langage Java.

Une autre bonne ressource est la documentation du lanceur d’applications lui-même:

8
Mark Peters

Si vous exécutez la classe correcte et que le principal est correctement défini, vérifiez également si vous avez une classe appelée String définie dans le même package. Cette définition de la classe String sera prise en compte et, comme elle ne confirme pas main(Java.lang.String[] args), vous obtiendrez la même exception.

  • Ce n'est pas une erreur de compilation car le compilateur suppose que vous définissez une méthode principale personnalisée. 

Nous vous suggérons de ne jamais masquer les classes Java de la bibliothèque dans votre package.

5
bschandramohan

Le nom de l'exception suggère que le programme a tenté d'appeler une méthode qui n'existe pas. Dans ce contexte, il semble que le programme ne possède pas de méthode main, bien que cela aiderait si vous publiez le code qui a provoqué l'erreur et le contexte dans lequel le code a été exécuté.

Cela est peut-être arrivé si l'utilisateur avait essayé d'exécuter un fichier .class ou un fichier .jar sans méthode main - en Java, la méthode main est le point de départ pour l'exécution du programme.

Normalement, le compilateur est censé empêcher cela de se produire. Si cela se produit, c'est généralement parce que le nom de la méthode appelée est en train d'être déterminé au moment de l'exécution, plutôt que lors de la compilation.

Pour résoudre ce problème, un nouveau programmeur doit soit ajouter la méthode d'interrogation (en supposant que c'est toujours main qui manque) ou modifier l'appel de méthode en le nom d'une méthode existante.

En savoir plus sur la méthode principale ici: http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html

En règle générale, cela signifie que le programme que vous essayez d'exécuter n'a pas de méthode "principale". Si vous allez exécuter un programme Java, la classe en cours d'exécution doit avoir une méthode main

Par exemple, dans le fichier Foo.Java

public class Foo {
    public static void main(args[]) {
        System.out.println("hello");
    }
}

Ce programme ne devrait compiler et exécuter aucun problème - si main était appelé autre chose ou n'était pas statique, il générerait l'erreur que vous avez rencontrée.

Chaque programme exécutable, quelle que soit la langue, nécessite un point d'entrée pour indiquer à l'interpréteur, au système d'exploitation ou à la machine où commencer l'exécution. Dans le cas de Java, il s'agit de la méthode statique main, à laquelle est transmis le paramètre args[] contenant les arguments de la ligne de commande.
c'est équivalent à int main(int argc, char** argv) en C

1
Magnus

Je pense que les réponses ci-dessus manquent un scénario où cette erreur se produit même lorsque votre code a un main () Lorsque vous utilisez JNI, utilisez Reflection pour appeler une méthode. Au cours de l'exécution, si la méthode est introuvable, vous obtiendrez un

Java.lang.NoSuchMethodError: No virtual method

0
likejudo

Quelques minutes en arrière, je faisais face à "méthode principale non définie" .Maintenant sa résolution. J'ai essayé tout ce qui précède, mais rien ne fonctionnait.

  • fait simplement maven update dans tous les projets dépendants (alt + F5).

Maintenant le problème est résolu.Obtenir le résultat requis.

0
Raj Kumar Mishra