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.

3voto

Anton Shchastnyi Punkte 3714

In Anbetracht der Aktionen des Class loader sussystem:

http://www.artima.com/insidejvm/ed2/images/fig7-1.gif

Dieser Artikel hat mir sehr geholfen, den Unterschied zu verstehen: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

Wenn beim Laden der Klasse ein Fehler auftritt, dann Unterklasse von LinkageError muss auf einen Poi geworfen werden (direkt oder indirekt) die geladene Klasse oder Schnittstelle verwendet.

Wenn die Java Virtual Machine jemals versucht, die Überprüfung (§5.4.1) oder Auflösung (§5.4.3) zu laden (aber nicht während der Initialisierung (§5.5)), und der Klassenlader, der verwendet wird, um das Laden von C zu initiieren wirft eine Instanz von ClassNotFoundException dann wird die Java Virtual Maschine eine Instanz von NoClassDefFoundError w die Instanz der ClassNotFoundException .

Also ein ClassNotFoundException ist eine Hauptursache für NoClassDefFoundError .
Und eine NoClassDefFoundError ist ein Sonderfall des Typ-Ladefehlers, der auftritt bei Verlinkung Schritt.

2voto

leef Punkte 615

Fügen Sie einen möglichen Grund aus der Praxis hinzu:

  • ClassNotFoundException: wie cletus sagte, verwenden Sie Schnittstelle, während geerbte Klasse der Schnittstelle nicht im Klassenpfad ist. Z.B., Service Provider Pattern (oder Service-Suchmaschine ) versuchen, eine nicht existierende Klasse zu finden
  • NoClassDefFoundError: Die angegebene Klasse wird gefunden, aber die Abhängigkeit der angegebenen Klasse wird nicht gefunden

In der Praxis, Fehler kann geworfen werden schweigend Wenn Sie z. B. eine Timer-Aufgabe einreichen und in der Timer-Aufgabe die Meldung Fehler , während Ihr Programm in den meisten Fällen nur die Ausnahme . Dann wird die Zeitschaltuhr Die Hauptschleife wird ohne jegliche Information beendet. Ein ähnlicher Fehler wie NoClassDefFoundError ist ExceptionInInitializerError wenn Ihr statischer Initialisierer oder der Initialisierer für eine statische Variable eine Ausnahme auslöst.

2voto

Naresh Joshi Punkte 3792

ClassNotFoundException ist eine geprüfte Ausnahme, die auftritt, wenn wir die JVM anweisen, eine Klasse anhand ihres String-Namens mit den Methoden Class.forName() oder ClassLoader.findSystemClass() oder ClassLoader.loadClass() zu laden, und die besagte Klasse nicht im Klassenpfad gefunden wird.

Meistens tritt diese Ausnahme auf, wenn Sie versuchen, eine Anwendung auszuführen, ohne den Klassenpfad mit den erforderlichen JAR-Dateien zu aktualisieren. Zum Beispiel können Sie diese Ausnahme gesehen haben, wenn Sie den JDBC-Code für die Verbindung zu Ihrer Datenbank, z. B. MySQL, ausführen, aber Ihr Klassenpfad enthält keine JAR-Dateien dafür.

NoClassDefFoundError Fehler tritt auf, wenn die JVM versucht, eine bestimmte Klasse zu laden, die Teil Ihrer Codeausführung ist (als Teil eines normalen Methodenaufrufs oder als Teil der Erstellung einer Instanz mit dem Schlüsselwort new) und diese Klasse nicht in Ihrem Klassenpfad vorhanden ist, aber zur Kompilierungszeit vorhanden war, denn um Ihr Programm auszuführen, müssen Sie es kompilieren, und wenn Sie versuchen, eine Klasse zu verwenden, die nicht vorhanden ist, löst der Compiler einen Kompilierungsfehler aus.

Nachfolgend die Kurzbeschreibung

enter image description here

Sie können lesen Alles über ClassNotFoundException Vs NoClassDefFoundError für weitere Einzelheiten.

0voto

Ich erinnere mich immer wieder an Folgendes, wenn ich eine Auffrischung brauche

ClassNotFoundException

Hierarchie der Klassen

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Während der Fehlersuche

  1. Erforderliches jar, Klasse fehlt im Klassenpfad.
  2. Stellen Sie sicher, dass sich alle erforderlichen Jars im Klassenpfad von jvm befinden.

NoClassDefFoundError

Hierarchie der Klassen

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Während der Fehlersuche

  1. Problem beim dynamischen Laden einer Klasse, die ordnungsgemäß kompiliert wurde
  2. Problem mit statischen Blöcken, Konstruktoren, init()-Methoden der abhängigen Klasse und der eigentliche Fehler wird von mehreren Schichten umhüllt [vor allem, wenn Sie Frühling, Hibernate verwenden, wird die eigentliche Ausnahme umhüllt und Sie erhalten NoClassDefError]
  3. Wenn Sie "ClassNotFoundException" unter einem statischen Block einer abhängigen Klasse sehen
  4. Problem mit Versionen der Klasse. Dies geschieht, wenn Sie zwei Versionen v1, v2 der gleichen Klasse unter verschiedenen Jar/Packages haben, die erfolgreich mit v1 kompiliert wurde und v2 zur Laufzeit geladen wird, die nicht die relevanten Methoden/Vars hat& Sie werden diese Ausnahme sehen. [Ich habe dieses Problem einmal gelöst, indem ich das Duplikat der log4j-bezogenen Klasse unter mehreren Jars, die im Klassenpfad auftauchten, entfernt habe.]

-1voto

Neeraj Gahlawat Punkte 1213

ClassNotFoundException und NoClassDefFoundError treten auf, wenn eine bestimmte Klasse zur Laufzeit nicht gefunden wird, allerdings in unterschiedlichen Szenarien.

ClassNotFoundException ist eine Ausnahme, die auftritt, wenn Sie versuchen, eine Klasse zur Laufzeit mit den Methoden Class.forName() oder loadClass() zu laden und die genannten Klassen nicht im Klassenpfad gefunden werden.

    public class MainClass
    {
        public static void main(String[] args)
        {
            try
            {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            }catch (ClassNotFoundException e)
            {
                e.printStackTrace();
            }
        }
    }

    java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
    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.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at pack1.MainClass.main(MainClass.java:17)

NoClassDefFoundError ist ein Fehler, der auftritt, wenn eine bestimmte Klasse zur Kompilierzeit vorhanden ist, aber zur Laufzeit fehlt.

    class A
    {
      // some code
    }
    public class B
    {
        public static void main(String[] args)
        {
            A a = new A();
        }
    }

Wenn Sie das obige Programm kompilieren, werden zwei .class-Dateien erzeugt. Eine ist A.class und die andere ist B.class. Wenn Sie die Datei A.class entfernen und die Datei B.class ausführen, löst das Java Runtime System den Fehler NoClassDefFoundError aus, wie unten dargestellt:

    Exception in thread "main" java.lang.NoClassDefFoundError: A
    at MainClass.main(MainClass.java:10)
    Caused by: java.lang.ClassNotFoundException: A
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)

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