61 votes

"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 provoquer et que faut-il faire pour le réparer ?

0 votes

Je suppose qu'ils appellent une fonction qui n'existe pas, mais le compilateur est censé vous arrêter si vous faites cela.

0 votes

@eternalmatt - C'est un cas que le compilateur ne peut pas traiter. Voir ma réponse pour plus de détails.

43voto

Stephen C Points 255558

Lorsque vous utilisez le 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 et recherche ensuite la méthode du point d'entrée appelée main . Plus précisément, il recherche une méthode qui se déclare comme suit :

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

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

  1. La méthode doit se trouver dans la classe désignée.
  2. Le nom de la méthode doit être "main" avec exactement que la capitalisation 1 .
  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 de l'argument doit être String[] 3 .

(L'argument puede être déclaré en utilisant varargs syntaxe ; par exemple String... args . Voir cette question pour plus d'informations. Le site String[] est utilisé pour passer les arguments de la ligne de commande, et est requis même si votre application ne prend aucun argument de ligne de commande).

Si l'une des exigences ci-dessus n'est pas satisfaite, le 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 exécutez un extrêmement ancienne version de Java :

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

Si vous rencontrez cette erreur, vérifiez que vous avez une main et qu'il satisfait aux six exigences énumérées ci-dessus.


1 - Une variante vraiment obscure de cette situation est celle où 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 - Aquí est une explication de la raison pour laquelle la méthode doit être statique.
3 - String doit correspondre à java.lang.String et non à une classe personnalisée nommée String le cacher.

14voto

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

Il

  • doit être static
  • doit avoir exactement un argument de type String array (qui peut être nommé n'importe comment)
  • doit s'écrire m-a-i-n en minuscules.

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

8voto

Mark Peters Points 42201

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

La source qui fait le plus autorité est le VM spec (deuxième édition citée). Comme main n'est pas une caractéristique du langage, elle n'est pas prise en compte dans la spécification du langage Java.

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

5voto

Chandra Mohan Points 772

Si vous exécutez la bonne classe et que la main est correctement définie, vérifiez également si vous avez une classe appelée String définie dans le même paquetage. Cette définition de la classe String sera considérée et puisqu'elle ne confirme pas à main(java.lang.String[] args) vous obtiendrez la même exception.

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

Il est conseillé de ne jamais cacher les classes de la bibliothèque java dans votre paquet.

3voto

Le nom de l'exception suggère que le programme a essayé d'appeler une méthode qui n'existe pas. Dans ce contexte, il semble que le programme ne dispose pas d'une méthode de type main mais il serait utile que vous indiquiez le code qui a provoqué l'erreur et le contexte dans lequel il a été exécuté.

Cela a pu se produire si l'utilisateur a essayé d'exécuter une .class ou un fichier .jar qui n'a pas de main en Java, la méthode main est le point d'entrée pour commencer à exécuter le programme.

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

Pour résoudre ce problème, un nouveau programmeur doit soit ajouter la méthode midding (en supposant toujours qu'elle est main qui manque) ou changer l'appel de la méthode par le nom d'une méthode qui existe.

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

0 votes

Le compilateur ne peut pas s'en occuper. Il ne sait pas si l'utilisateur est va utiliser la classe qu'il compile comme "point d'entrée" pour le programme, et donc si une main méthode devrait existent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X