webentwicklung-frage-antwort-db.com.de

"Fehler: Hauptmethode in Klasse MyClass nicht gefunden. Definieren Sie die Hauptmethode als ..."

Neue Java-Programmierer erhalten diese Meldungen häufig, wenn sie versuchen, ein Java-Programm auszuführen.


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"

Was bedeutet das, was kann es bewirken, und was sollte man dagegen tun?

53
Stephen C

Wenn Sie den Befehl Java verwenden, um eine Anwendung Java über die Befehlszeile auszuführen, z.

Java some.AppName arg1 arg2 ...

der Befehl lädt die von Ihnen angegebene Klasse und sucht dann nach der Einstiegspunktmethode mit dem Namen main. Insbesondere wird nach einer Methode gesucht, die wie folgt deklariert ist:

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

Die spezifischen Anforderungen für die Einstiegspunktmethode sind:

  1. Die Methode muss in der angegebenen Klasse sein.
  2. Der Name der Methode muss "main" mit genau dieser Großschreibung sein1.
  3. Die Methode muss public sein.
  4. Die Methode muss static sein 2.
  5. Der Rückgabetyp der Methode muss void sein.
  6. Die Methode muss genau ein Argument haben und der Typ des Arguments muss String[] sein. 3.

(Das Argument kann mit varargs-Syntax deklariert werden; z. B. String... args. Siehe diese Frage für weitere Informationen. Das Argument String[] wird zur Übergabe der Argumente über die Befehlszeile verwendet und ist auch dann erforderlich, wenn Ihre Anwendung keine Befehlszeilenargumente akzeptiert.)

Wenn eine der oben genannten Anforderungen nicht erfüllt ist, schlägt der Befehl Java mit 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 extrem alte Version von Java verwenden:

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

Wenn Sie auf diesen Fehler stoßen, überprüfen Sie, ob Sie eine main -Methode haben und ob diese alle 6 der oben aufgeführten Anforderungen erfüllt.


1 - Eine wirklich undurchsichtige Variante ist, wenn eines oder mehrere der Zeichen in "main" KEIN LATIN-1-Zeichen ist ... sondern ein Unicode-Zeichen, das wie das aussieht entsprechendes LATIN-1-Zeichen bei Anzeige.

2 - Siehe Warum ist die Hauptmethode Java statisch? für eine Erklärung, warum die Methode statisch sein muss.

3 - String muss Java.lang.String entsprechen und darf nicht einer benutzerdefinierten Klasse mit dem Namen String entsprechen, die sie verbirgt.

37
Stephen C

Das Problem ist, dass Sie keine public void main(String[] args)-Methode in der Klasse haben, die Sie aufzurufen versuchen.

Es 

  • muss static sein
  • muss genau ein String-Array-Argument haben (das beliebig benannt werden kann)
  • muss m-a-i-n in Kleinbuchstaben geschrieben werden.

Beachten Sie, dass Sie tatsächlich eine vorhandene Klasse HAVE angegeben haben (sonst wäre der Fehler anders gewesen), dieser Klasse fehlt jedoch die Hauptmethode.

Andere Antworten fassen die Anforderungen von main gut zusammen. Ich möchte Hinweise darauf sammeln, wo diese Anforderungen dokumentiert sind.

Die maßgeblichste Quelle ist die VM-Spezifikation (zweite Ausgabe). Da main keine Sprachfunktion ist, wird sie in der Java-Sprachspezifikation nicht berücksichtigt.

Eine weitere gute Ressource ist die Dokumentation für das Application Launcher selbst:

8
Mark Peters

Wenn Sie die richtige Klasse ausführen und die Hauptklasse ordnungsgemäß definiert ist, überprüfen Sie auch, ob in demselben Paket eine Klasse namens String definiert ist. Diese Definition der String-Klasse wird berücksichtigt und da sie nicht main(Java.lang.String[] args) bestätigt, erhalten Sie dieselbe Ausnahme.

  • Es ist kein Fehler beim Kompilieren, da der Compiler nur annimmt, dass Sie eine benutzerdefinierte Hauptmethode definieren. 

Es wird empfohlen, Bibliothek-Java-Klassen niemals in Ihrem Paket auszublenden.

5
bschandramohan

Der Name der Ausnahme legt nahe, dass das Programm versucht hat, eine Methode aufzurufen, die nicht vorhanden ist. In diesem Zusammenhang scheint das Programm keine main-Methode zu haben, obwohl es hilfreich wäre, wenn Sie den Code posten, der den Fehler verursacht hat, und den Kontext, in dem der Code ausgeführt wurde.

Dies ist möglicherweise der Fall, wenn der Benutzer versucht hat, eine .class-Datei oder eine .jar-Datei ohne main-Methode auszuführen. In Java ist die main-Methode der Einstiegspunkt für die Ausführung des Programms.

Normalerweise soll der Compiler dies verhindern. Wenn dies der Fall ist, wird normalerweise der Name der aufgerufenen Methode zur Laufzeit und nicht zur Kompilierzeit bestimmt.

Um dieses Problem zu beheben, muss ein neuer Programmierer entweder die mittlere Methode hinzufügen (vorausgesetzt, dass noch main fehlt) oder den Methodenaufruf in den Namen einer vorhandenen Methode ändern.

Lesen Sie mehr über die Hauptmethode hier: 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, muss die Klasse, die ausgeführt wird, eine main-Methode haben

Zum Beispiel in der Datei Foo.Java

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

Dieses Programm sollte kompilieren und kein Problem ausführen. Wenn main etwas anderes genannt wird oder nicht statisch ist, würde dies den aufgetretenen Fehler verursachen.

Jedes ausführbare Programm benötigt unabhängig von der Sprache einen Einstiegspunkt, um dem Interpreter, dem Betriebssystem oder der Maschine mitzuteilen, wo die Ausführung beginnen soll. In Java ist dies die statische Methode main, an die der Parameter args[] übergeben wird, der die Befehlszeilenargumente enthält.
es entspricht int main(int argc, char** argv) in C

1
Magnus

Ich denke, dass die obigen Antworten ein Szenario vermissen, in dem dieser Fehler auftritt, selbst wenn Ihr Code ein main () hat. Wenn Sie JNI verwenden, verwendet Reflection , um eine Methode aufzurufen. Wird die Methode zur Laufzeit nicht gefunden, erhalten Sie eine

Java.lang.NoSuchMethodError: No virtual method

0
likejudo

Vor ein paar Minuten war ich mit "Hauptmethode nicht definiert" konfrontiert. Jetzt ist es gelöst. Ich habe alles versucht, aber nichts funktionierte. In meiner Java-Datei war kein Kompilierungsfehler. Ich folgte den folgenden Schritten

  • einfach maven update in allen abhängigen projekten (alt + F5).

Nun Problem gelöst. Erforderliches Ergebnis erhalten.

0