ClassNotFoundException wird ausgelöst, wenn versucht wird, die Klasse zu laden, indem sie über einen String referenziert wird. Zum Beispiel ist der Parameter to in Class.forName() ein String, und dies erhöht die Möglichkeit, dass ungültige Binärnamen an den Classloader übergeben werden.
Die ClassNotFoundException wird ausgelöst, wenn ein potenziell ungültiger Binärname angetroffen wird; wenn der Klassenname beispielsweise das Zeichen '/' enthält, erhalten Sie zwangsläufig eine ClassNotFoundException. Sie wird auch ausgelöst, wenn die direkt referenzierte Klasse nicht auf dem Klassenpfad verfügbar ist.
Andererseits, NoClassDefFoundError wird geworfen
- wenn die eigentliche physische Darstellung der Klasse - die .class-Datei - nicht verfügbar ist,
- oder die Klasse wurde bereits in einem anderen Classloader geladen (in der Regel hat ein übergeordneter Classloader die Klasse geladen, so dass sie nicht erneut geladen werden kann),
- oder wenn eine inkompatible Klassendefinition gefunden wurde - der Name in der Klassendatei stimmt nicht mit dem angeforderten Namen überein,
- oder (was am wichtigsten ist) wenn eine abhängige Klasse nicht gefunden und geladen werden kann. In diesem Fall könnte die direkt referenzierte Klasse gefunden und geladen worden sein, aber die abhängige Klasse ist nicht verfügbar oder kann nicht geladen werden. Dies ist ein Szenario, in dem die direkt referenzierte Klasse über Class.forName oder gleichwertige Methoden geladen werden kann. Dies deutet auf einen Fehler in der Verknüpfung hin.
Kurz gesagt, ein NoClassDefFoundError wird normalerweise bei new()-Anweisungen oder Methodenaufrufen ausgelöst, die eine zuvor nicht vorhandene Klasse laden (im Gegensatz zum stringbasierten Laden von Klassen bei ClassNotFoundException), wenn der Classloader die Klassendefinition(en) nicht finden oder laden kann.
Letztendlich obliegt es der ClassLoader-Implementierung, eine Instanz von ClassNotFoundException zu werfen, wenn sie eine Klasse nicht laden kann. Die meisten benutzerdefinierten Classloader-Implementierungen führen dies aus, da sie den URLClassLoader erweitern. In der Regel lösen Classloader nicht explizit einen NoClassDefFoundError bei einer der Methodenimplementierungen aus - diese Ausnahme wird in der Regel von der JVM im HotSpot-Compiler und nicht vom Classloader selbst ausgelöst.