389 Stimmen

Was sind die Ursachen und Unterschiede zwischen NoClassDefFoundError und ClassNotFoundException?

Was ist der Unterschied zwischen NoClassDefFoundError y ClassNotFoundException ?

Wodurch werden sie ausgelöst? Wie können sie behoben werden?

Ich stoße oft auf diese Throwables, wenn ich bestehenden Code modifiziere, um neue Jar-Dateien einzubinden. Ich habe sie sowohl auf der Client- als auch auf der Serverseite für eine über Webstart verteilte Java-Anwendung gefunden.

Mögliche Gründe, die ich gefunden habe:

  1. Pakete nicht enthalten in build.xml für die Client-Seite des Codes
  2. Laufzeit-Klassenpfad fehlt für die neuen Jars, die wir verwenden
  3. Versionskonflikte mit früherem jar

Wenn ich heute auf diese Probleme stoße, versuche ich, die Dinge durch Versuch und Irrtum zum Laufen zu bringen. Ich brauche mehr Klarheit und Verständnis.

15voto

Donal Fellows Punkte 125686

Was ist der Grund dafür, dass Sie diese Fehler bekommen haben, und welche Überlegungen gibt es, wie man mit solchen Fehlern umgehen kann?

Sie sind eng miteinander verwandt. A ClassNotFoundException wird ausgelöst, wenn Java eine bestimmte Klasse anhand ihres Namens gesucht hat und sie nicht erfolgreich laden konnte. A NoClassDefFoundError wird ausgelöst, wenn Java nach einer Klasse gesucht hat, die in einen bestehenden Code eingebunden wurde, sie aber aus dem einen oder anderen Grund nicht finden konnte (z.B. falscher Klassenpfad, falsche Java-Version, falsche Version einer Bibliothek) und ist durchaus fatal, da es anzeigt, dass etwas schief gelaufen ist.

Wenn Sie einen C-Hintergrund haben, ist ein CNFE wie ein Versagen bei dlopen() / dlsym() und ein NCDFE ist ein Problem mit dem Linker; im zweiten Fall sollten die betroffenen Klassendateien eigentlich nie in der Konfiguration kompiliert worden sein, in der Sie sie zu verwenden versuchen.

11voto

Dinesh Punkte 1098

Beispiel #1:

class A{
 void met(){
   Class.forName("com.example.Class1");
 }
}

Si com/example/Class1 in keinem der Klassenpfade vorhanden ist, dann löst es ClassNotFoundException .

Beispiel #2:

Class B{
  void met(){
   com.example.Class2 c = new com.example.Class2();
 }
}

Si com/example/Class2 bei der Kompilierung von B vorhanden war, aber bei der Ausführung nicht gefunden wurde, dann wirft es NoClassDefFoundError .

Beides sind Laufzeitausnahmen.

10voto

Lawakush Kurmi Punkte 2246

Unterschied zwischen ClassNotFoundException Vs NoClassDefFoundError

enter image description here

9voto

Vineet Reynolds Punkte 74302

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.

9voto

Premraj Punkte 65511

Anhand der Namen selbst können wir leicht erkennen, dass es sich um Exception und die andere ist von Error .

Eine Ausnahme: Ausnahmen treten während der Ausführung eines Programms auf. Ein Programmierer kann diese Ausnahmen mit einem Try-Catch-Block behandeln. Wir haben zwei Arten von Ausnahmen. Geprüfte Ausnahmen, die zur Kompilierzeit ausgelöst werden. Laufzeitausnahmen, die zur Laufzeit ausgelöst werden. Diese Ausnahmen treten in der Regel aufgrund einer fehlerhaften Programmierung auf.

Fehler: Dabei handelt es sich nicht um Ausnahmen, das liegt außerhalb der Möglichkeiten des Programmierers. Diese Fehler werden normalerweise von der JVM ausgelöst.


enter image description here Bildquelle

Der Unterschied:

ClassNotFoundException:

  • Der Klassenlader kann nicht Überprüfen Sie einen Bytecode in Verlinkung .
  • ClassNotFoundException ist eine geprüfte Ausnahme, die auftritt, wenn eine Anwendung versucht, eine Klasse über ihren vollqualifizierten Namen zu laden und ihre Definition im Klassenpfad nicht finden kann.
  • ClassNotFoundException wird angezeigt, wenn es eine explizites Laden der Klasse erfolgt durch Angabe des Klassennamens zur Laufzeit mit ClassLoader.loadClass(), Class.forName() und ClassLoader.findSystemClass().

NoClassDefFoundError:

  • Klassenlader schlägt fehl die Lösung Referenzen einer Klasse in Verlinkung .
  • NoClassDefFoundError ist ein Fehler, der von LinkageError Klasse, was ein fataler Fehler ist. Er tritt auf, wenn die JVM die Definition der Klasse nicht finden kann, während sie versucht, eine Klasse mit dem Schlüsselwort new zu instanziieren oder eine Klasse mit einem Methodenaufruf zu laden.
  • NoClassDefFoundError ist ein Ergebnis von implizites Laden der Klasse aufgrund eines Methodenaufrufs aus dieser Klasse oder eines Variablenzugriffs.

Ähnlichkeiten:

  • Beide NoClassDefFoundError y ClassNotFoundException stehen im Zusammenhang mit der Nichtverfügbarkeit einer Klasse zur Laufzeit.
  • Beide ClassNotFoundException y NoClassDefFoundError sind mit dem Java-Klassenpfad verbunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X