“Fehler: Hauptmethode nicht in Klasse MyClass gefunden, bitte definieren Sie die Hauptmethode als…”

Lesezeit: 6 Minuten

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?

  • 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

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:

  1. Die Methode muss in der nominierten Klasse sein.
  2. Der Name der Methode muss mit „main“ sein exakt diese Großschreibung1.
  3. Die Methode muss sein public.
  4. Die Methode muss sein static 2.
  5. Der Rückgabetyp der Methode muss sein void.
  6. 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

  • Damit kann der Compiler nicht umgehen. Es weiß nicht, ob der Benutzer ist gehen zu Verwenden Sie die Klasse, die es kompiliert, als “Einstiegspunkt” für das Programm und ob Sie daher eine geeignete main Methode sollte existieren.

    – Stefan C

    8. Oktober 2014 um 6:12 Uhr

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 maindem der Parameter übergeben wird args[] enthält die Kommandozeilenargumente. Diese Methode ist äquivalent zu int main(int argc, char** argv) in C-Sprache.

  • Damit kann der Compiler nicht umgehen. Es weiß nicht, ob der Benutzer ist gehen zu Verwenden Sie die Klasse, die es kompiliert, als “Einstiegspunkt” für das Programm und ob Sie daher eine geeignete main Methode sollte existieren.

    – Stefan C

    8. Oktober 2014 um 6:12 Uhr

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

  • Das ist nicht die Fehlermeldung, die die Frage erklären soll. Die Frage bezieht sich speziell auf eine fehlende “Haupt” -Methode. (Und bitte sagen Sie mir nicht, dass es nicht … weil ich es geschrieben habe.) Wenn Sie ein anderes Szenario ansprechen möchten, können Sie gerne eine andere Frage öffnen und selbst beantworten.)

    – Stefan C

    27. Februar 2015 um 23:13 Uhr


1002140cookie-check“Fehler: Hauptmethode nicht in Klasse MyClass gefunden, bitte definieren Sie die Hauptmethode als…”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy