Ein NoClassDefFoundError (NCDFE) tritt auf, wenn Ihr Code "new Y ()" ausführt und die Y-Klasse nicht gefunden werden kann.
Es kann einfach sein, dass Y in Ihrem Klassenladeprogramm fehlt, wie die anderen Kommentare vermuten lassen, aber es kann sein, dass die Y-Klasse nicht signiert ist oder eine ungültige Signatur hat oder dass Y von einem anderen Klassenladeprogramm geladen wird, das für Ihren Code nicht sichtbar ist oder sogar, dass Y von Z abhängt, das aus einem der oben genannten Gründe nicht geladen werden konnte.
In diesem Fall merkt sich die JVM das Ergebnis des Ladens von X (NCDFE) und wirft jedes Mal, wenn Sie nach Y fragen, einfach ein neues NCDFE, ohne Ihnen mitzuteilen, warum:
Klasse a {
statische Klasse b {}
public static void main (String args []) {
System.out.println ("Erster Versuch neu b ():");
try {new b (); } catch (Throwable t) {t.printStackTrace ();}
System.out.println ("\ nZweiger Versuch new b ():");
try {new b (); } catch (Throwable t) {t.printStackTrace ();}
}}
}}
Speichern Sie dies irgendwo als a.java
Der Code versucht einfach zweimal, eine neue "b" -Klasse zu instanziieren, ansonsten hat er keine Fehler und tut nichts.
Kompilieren Sie den Code mit javac a.java
. Führen Sie dann a durch Aufrufen aus. java -cp . a
Es sollte nur zwei Textzeilen ausdrucken und fehlerfrei funktionieren.
Löschen Sie dann die Datei "a $ b.class" (oder füllen Sie sie mit Müll oder kopieren Sie eine Klasse darüber), um die fehlende oder beschädigte Klasse zu simulieren. Folgendes passiert:
Erster Versuch neu b ():
java.lang.NoClassDefFoundError: a $ b
um a.main (a.java:5)
Auslöser: java.lang.ClassNotFoundException: a $ b
bei java.net.URLClassLoader $ 1.run (URLClassLoader.java:200)
at java.security.AccessController.doPrivileged (native Methode)
bei java.net.URLClassLoader.findClass (URLClassLoader.java:188)
bei java.lang.ClassLoader.loadClass (ClassLoader.java:307)
at sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:301)
bei java.lang.ClassLoader.loadClass (ClassLoader.java:252)
bei java.lang.ClassLoader.loadClassInternal (ClassLoader.java:320)
... 1 mehr
Zweiter Versuch neu b ():
java.lang.NoClassDefFoundError: a $ b
um a.main (a.java:7)
Der erste Aufruf führt zu einer ClassNotFoundException (durch den Klassenlader geworfen , wenn es nicht die Klasse finden kann), die in einem ungeprüften NoClassDefFoundError gewickelt werden müssen, da der Code in Frage ( new b()
) soll nur Arbeit.
Der zweite Versuch schlägt natürlich ebenfalls fehl, aber wie Sie sehen, ist die umschlossene Ausnahme nicht mehr vorhanden, da sich der ClassLoader an fehlgeschlagene Klassenlader zu erinnern scheint. Sie sehen nur die NCDFE, die absolut keine Ahnung hat, was wirklich passiert ist.
Wenn Sie also jemals ein NCDFE ohne Grundursache sehen, müssen Sie prüfen, ob Sie bis zum ersten Laden der Klasse zurückverfolgen können, um die Fehlerursache zu finden.
-verbose
(z. B.-verbose:class -verbose:jni
) zu betreiben - aber Mogsie berichtet unter ihrer Antwort, dass dies keine zusätzlichen nützlichen Informationen liefert :(