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 einen String geladen werden soll (z. B. durch den Aufruf Class.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 Klasse class im Package Test gesucht. Sie wollen aber eigentlich die Klasse Test 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.

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.