Static-block wird nicht ausgeführt in JDK 7, "Main-Methode nicht gefunden", arbeitet aber im JDK 1.5
Ich geschrieben habe eine einfache Klasse mit einer static-block
class Hello
{
static {
System.out.println("Hello");
System.exit(0);
}
}
Bei mir läuft es mit jdk1.5, static-block wird immer ausgeführt
C:\apps\Java\jdk1.5.0_21\bin>javac Hello.java
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>
C:\apps\Java\jdk1.5.0_21\bin>java Hello
Hello
Aber bei mir läuft es mit jdk1.7, ich erhalte folgenden Fehler
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>javac Hello.java
C:\Program Files (x86)\Java\jdk1.7.0_02\bin>java Hello
Error: Main method not found in class Hello, please define the main method as:
public static void main(String[] args)
Kann jemand eine Idee haben, über diese Veränderung des Verhaltens in der JDK 5 und JDK 7?
Vielen Dank im Voraus!!
- Sehen Sie, diese Frage im Zusammenhang: stackoverflow.com/questions/17496829/... ich bin nicht sicher, dies ist ein Duplikat dieser Frage, denn diese Frage nimmt die änderung im Verhalten zwischen JDK 1.5 und 7.
- Meine Antwort auf diese Frage weist auch auf die änderung im Verhalten zwischen Java 7 und pre-Java-7.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java 7 sieht eine main-Methode vor dem laden der Klasse. Dies ist eine Verhaltensänderung von älteren java-Versionen und somit static-block wird nicht ausgeführt. In früheren Versionen wurde das Verhalten, die JRE verwendet, um den Blick für die main-Methode post laden der Klasse und nach der Ausführung des statischen blocks.
Ja, in jdk7. Statische Blöcke sind nicht zuerst ausgeführt wird. Es sieht zunächst für den Einstiegspunkt in die Anwendung.
So, es wird zuerst überprüft
public static void main(String a[])
, wenn diese Methode nicht vorhanden, static-block wird nicht ausgeführt.Gehen durch JLS 12.1:
Java 7 sieht für
public static main(String[] args)
Methode , der Einstiegspunkt für die Anwendung und lädt dann die Klasse , im Gegensatz zu Java 6, lädt die Klasse und sucht sich dann diemain
Methode.Müssen Sie wohl
public static void main(String[] args){ }
Methode in der Klasse für JDK7.In JDK7, main-Methode die Anwesenheit geprüft wird, bevor der statische block und wenn Sie nicht finden, bekommen Sie die Ausnahme.
Das Programm nicht ausführen, weil aus dem JDK 1.7 von oracle hat die Einschränkung auf statische block und statische variable aufrufende Methode wenn Ihr Programm nicht main-Methode mit der richtigen Signatur, aber static-block und-Methode wird immer zuerst ausgeführt.Als memory-management von statischen Variablen erfolgen in der Zeit für das laden der Klassen.
Wenn Sie Lesen, die JLS Kapitel 12 sorgfältig (version 5 oder 7), ist es nicht angegeben, wenn die statische Initialisierung der "main" - Klasse erfolgen soll. In der Tat, es ist ein Bug-Report, die beschwert sich über dieses.
Was ist angegeben ist, dass die "main" Klasse initialisiert wird (und die statischen Initialisierungen ausgeführt werden) vor der Eintrag-Punkt-Methode aufgerufen wird. Angegeben ist in JLS 12.4.1
Ich kann nicht erklären, warum änderten Sie diese, oder finden Sie, wo Sie dokumentiert die Veränderung. Aber anscheinend ist es hat ändern. Wenn Sie wollten, die wirkliche Erklärung würden Sie brauchen, um Fragen der Sun /Oracle-Ingenieure verantwortlich.
(FWIW, ich denke, dass dies ein gute ändern. Mit der statischen Initialisierung passieren, und dann das Programm zu einem Fehler, da die nicht gefunden der Eintrag Punkt ist unerwartete Verhalten, und unerwartete ist schlimm, wenn es keine gute Begründung.)
Sie nicht ausführen kann, ein java-Programm ohne main Methode, es sei denn, sonst ist es ein applet, oder etwas anderes. I sagen Sie Ihre Beobachtung auf jdks falsch sein könnte
Bis JDK1.6:-
Er zuerst die Klasse laden und beim laden der Klasse static-block wird ausgeführt.
und dann überprüfen Sie die main-Methode auszuführen.
JDK1.7 ab :
Überprüft es die main-Methode zunächst, ob es verfügbar ist oder nicht.
vor java 1.7 static-block wird ausgeführt, bevor die main-Methode, so können wir die Ausführung von code ohne main mehod, Seit JDK 1.7, es ist nicht möglich, führen statische bock, ohne die main-Methode,weil der compiler sucht für die main-Methode der Klasse file.
also, wenn wir wollen, um code auszuführen, in über JDK 1.7 es zeigen
Error: Main method not found in class hello, please define the main method as:
public static void main(String[] args)
oder eine JavaFX-Anwendung muss die Klasse erweitern javafx.- Anwendung.Anwendung