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?
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:
public
.static
2.void
.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.
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
static
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.
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:
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.
Nous vous suggérons de ne jamais masquer les classes Java de la bibliothèque dans votre package.
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
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
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.
Maintenant le problème est résolu.Obtenir le résultat requis.