Neue Java-Programmierer stoßen oft auf Meldungen wie die folgende, wenn sie versuchen, ein Java-Programm auszuführen. (Verschiedene Java-Tools, IDEs usw. bieten eine Vielzahl von Diagnosen für dieses Problem.)
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 not found in the file, please define the main method as:
public static void main(String[] args)
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"
Was bedeutet das, was kann es verursachen und was sollte man tun, um es zu beheben?
Wenn Sie die verwenden java
Befehl zum Ausführen einer Java-Anwendung über die Befehlszeile, z.
java some.AppName arg1 arg2 ...
Der Befehl lädt die von Ihnen angegebene Klasse und sucht dann nach der aufgerufenen Einstiegspunktmethode main
. Genauer gesagt sucht es nach einer Methode, die wie folgt deklariert ist:
package some;
public class AppName {
...
public static void main(final String[] args) {
// body of main method follows
...
}
}
Die spezifischen Anforderungen für die Einstiegspunktmethode sind:
- Die Methode muss in der nominierten Klasse sein.
- Der Name der Methode muss mit „main“ sein exakt diese Großschreibung1.
- Die Methode muss sein
public
.
- Die Methode muss sein
static
2.
- Der Rückgabetyp der Methode muss sein
void
.
- Die Methode muss genau ein Argument haben und der Typ des Arguments muss sein
String[]
3.
(Das Argument dürfen mit deklariert werden varargs
Syntax; z.B String... args
. Weitere Informationen finden Sie in dieser Frage. Die String[]
argument wird verwendet, um die Argumente von der Befehlszeile zu übergeben, und ist auch dann erforderlich, wenn Ihre Anwendung keine Befehlszeilenargumente akzeptiert.)
Wenn eine der oben genannten Anforderungen nicht erfüllt ist, wird die java
Der Befehl schlägt bei einer Variante der Nachricht fehl:
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
Oder, wenn Sie eine ausführen äußerst alte Java-Version:
java.lang.NoSuchMethodError: main
Exception in thread "main"
Wenn dieser Fehler auftritt, überprüfen Sie, ob Sie eine haben main
Methode und dass es alle der sechs oben aufgeführten Anforderungen erfüllt.
1 – Eine wirklich obskure Variante davon ist, wenn eines oder mehrere der Zeichen in “main” KEIN LATIN-1-Zeichen ist … sondern ein Unicode-Zeichen, das sieht aus wie das entsprechende LATIN-1-Zeichen, wenn es angezeigt wird.
2 – Hier ist eine Erklärung, warum die Methode statisch sein muss.
3 – String
muss Standard sein java.lang.String
Klasse und nicht zu einer benutzerdefinierten Klasse namens String
das verbirgt die Standardklasse.
Das Problem ist, dass Sie keine haben public void main(String[] args)
Methode in der Klasse, die Sie aufzurufen versuchen.
Es
- muss sein
static
- muss genau ein String-Array-Argument haben (das beliebig heißen kann)
- muss main in Kleinbuchstaben geschrieben werden.
Beachten Sie, dass Sie tatsächlich eine vorhandene Klasse angegeben haben (andernfalls wäre der Fehler anders gewesen), aber dieser Klasse fehlt die Hauptmethode.
Andere Antworten fassen die Anforderungen von gut zusammen main
. Ich möchte Hinweise sammeln, wo diese Anforderungen dokumentiert sind.
Die maßgeblichste Quelle ist die VM
spec (zweite Auflage zitiert). Als main
kein Sprachfeature ist, wird es in der Java Language Specification nicht berücksichtigt.
Eine weitere gute Ressource ist die Dokumentation für den Anwendungsstarter selbst:
Wenn Sie die richtige Klasse ausführen und main richtig definiert ist, überprüfen Sie auch, ob Sie eine Klasse namens String im selben Paket definiert haben. Diese Definition der String-Klasse wird berücksichtigt und da nicht bestätigt main(java.lang.String[] args)
erhalten Sie die gleiche Ausnahme.
- Es handelt sich nicht um einen Kompilierzeitfehler, da der Compiler nur davon ausgeht, dass Sie eine benutzerdefinierte Hauptmethode definieren.
Der Vorschlag ist, Bibliotheks-Java-Klassen niemals in Ihrem Paket zu verstecken.
Der Name der Ausnahme deutet darauf hin, dass das Programm versucht hat, eine Methode aufzurufen, die nicht existiert. In diesem Zusammenhang klingt es so, als hätte das Programm keinen main
-Methode, obwohl es hilfreich wäre, wenn Sie den Code posten würden, der den Fehler verursacht hat, und den Kontext, in dem der Code ausgeführt wurde.
Dies ist möglicherweise passiert, wenn der Benutzer versucht hat, a auszuführen .class
Datei oder eine .jar
Datei, die keine hat main
Methode – in Java die main
Die Methode ist der Einstiegspunkt, um mit der Ausführung des Programms zu beginnen.
Normalerweise soll der Compiler dies verhindern. Wenn dies geschieht, liegt es normalerweise daran, dass der Name der aufgerufenen Methode zur Laufzeit und nicht zur Kompilierzeit bestimmt wird.
Um dieses Problem zu beheben, muss ein neuer Programmierer entweder die Midding-Methode hinzufügen (vorausgesetzt, es ist immer noch main
das fehlt) oder Ändern Sie den Methodenaufruf in den Namen einer vorhandenen Methode.
Lesen Sie hier mehr über die Hauptmethode: http://csis.pace.edu/~bergin/KarelJava2ed/ch2/javamain.html
Im Allgemeinen bedeutet dies, dass das Programm, das Sie ausführen möchten, keine „main“-Methode hat. Wenn Sie ein Java-Programm ausführen möchten, muss die auszuführende Klasse über eine verfügen main
Methode:
Beispielsweise in der Datei Foo.java
public class Foo {
public static void main(final String args[]) {
System.out.println("hello");
}
}
Dieses Programm sollte problemlos kompiliert und ausgeführt werden – wenn main
etwas anderes genannt wurde oder nicht statisch war, würde es den Fehler erzeugen, den Sie erlebt haben.
Jedes ausführbare Programm, unabhängig von der Sprache, benötigt einen Einstiegspunkt, um dem Interpreter, dem Betriebssystem oder der Maschine mitzuteilen, wo die Ausführung beginnen soll. Im Fall von Java ist dies die statische Methode main
dem der Parameter übergeben wird args[]
enthält die Kommandozeilenargumente. Diese Methode ist äquivalent zu int main(int argc, char** argv)
in C-Sprache.
Ich glaube, die obigen Antworten vermissen ein Szenario, in dem dieser Fehler auftritt, selbst wenn Ihr Code eine main() hat. Wenn Sie JNI verwenden, das verwendet Betrachtung um eine Methode aufzurufen. Wenn die Methode während der Laufzeit nicht gefunden wird, erhalten Sie eine
java.lang.NoSuchMethodError: No virtual method
10021400cookie-check“Fehler: Hauptmethode nicht in Klasse MyClass gefunden, bitte definieren Sie die Hauptmethode als…”yes
Ich vermute nur, dass sie eine Funktion aufrufen, die nicht existiert, aber der Compiler soll Sie stoppen, wenn Sie das tun würden.
– ewigmatt
23. März 2011 um 15:04 Uhr
@eternalmatt – Dies ist ein Fall, mit dem der Compiler nicht umgehen kann. Siehe meine Antwort für Details.
– Stefan C
8. Oktober 2014 um 6:09 Uhr