05.03 NoClassDefFoundError
Der NoClassDefFoundError
, oder ausgeschrieben No Class Definition Found Error (Klassendefinition nicht gefunden) wird immer dann ausgelöst, wenn die Definition einer Klasse (also die *.class-Datei) zur Laufzeit nicht gefunden werden kann, beim Kompilieren aber noch vorhanden war.
Beim NoClassDefFoundError
handelt es sich – wie der Name vermuten lässt – um einen Error und sollte/kann nicht (richtig) abgefangen werden. Er wird immer dann geworfen, wenn die Java Virtual Machine oder ein ClassLoader
einen Zugriff (z. B. als Teil eines Methodenaufrufs oder bei der Instanziierung über new
) auf eine Klasse nicht zuordnen kann.
Beachten Sie den Unterschied zur
ClassNotFoundException
, welche geworfen wird, wenn eine Klasse anhand ihres Namens über einenString
geladen werden soll (z. B. durch den AufrufClass.forName("java.lang.String")
, aber nicht gefunden wird.
Dies tritt meistens beim Starten des Programms auf und sieht in etwa so aus:
Exception in thread "main" java.lang.NoClassDefFoundError: de/jbb/TestClass
Caused by: java.lang.ClassNotFoundException: de.jbb.TestClass
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: de.jbb.TestClass. Program will exit.
Diese Fehlermeldung wurde durch den Aufruf java de.jbb.TestClass
an einer beliebigen Stelle ausgelöst.
Häufige Fehlerursachen
- Die Klasse wird nicht gefunden, da der Classpath nicht richtig gesetzt wurde.
- Sie rufen die Klasse mit dem Dateisuffix .class auf (
java Test.class
). In diesem Fall wird nach der Klasseclass
im PackageTest
gesucht. Sie wollen aber eigentlich die KlasseTest
ohne Package aufrufen. - Sie rufen die Klasse
ich.bin.in.EinemPackage
auf, befinden sich aber in der Ordnerstruktur ich/bin/in.
Fehlerbehebung
Versichern Sie sich, dass Sie den Classpath richtig gesetzt haben. Hierbei hilft Ihnen das Kapitel 07.03 Einbinden von externen Klassen – Classpath. Kontrollieren Sie Ihren java-Aufruf. Dabei helfen Ihnen die Kapitel 01.04.02 Analyse des Quellcodes und 07.04.01 java/javaw. Und kontrollieren Sie das Ausführungsverzeichnis. Eine Klasse, die in einem Package liegt, muss auch „über“ dieses Package aufgerufen werden. Liegt eine Klasse bspw. an dem Ort Laufwerk/Ordner/ich/bin/in/, heißt EinemPackage
und befindet sich im Package ich.bin.in
, müssen Sie die Klasse aus dem Verzeichnis Laufwerk/Ordner mit dem Befehl java ich.in.in.EinemPackage
aufrufen.