Frage

Was ist der Unterschied zwischen NoClassDefFoundError und ClassNotFoundException?

Was bewirkt, dass sie geworfen werden? Wie können sie gelöst werden?

ich oft auf diese Throwables der vorhandenen Code modifizieren neue JAR-Dateien enthalten. Ich habe sie getroffen sowohl auf der Client-Seite und die Server-Seite für eine Java-Anwendung durch webstart verteilt.

Mögliche Gründe, warum ich gekommen bin über:

  1. Pakete nicht für die Client-Seite Code in build.xml enthalten
  2. Laufzeit Classpath für die neuen Gläser fehlen wir mit
  3. Versionskonflikte mit früheren jar

Wenn ich diese heute begegnen nehme ich eine Spur-and-Error-Methode, um Dinge zu arbeiten. Ich brauche mehr Klarheit und Verständnis.

War es hilfreich?

Lösung

Der Unterschied zu den Java-API-Spezifikationen ist wie folgt.

ClassNotFoundException :

  

Geworfen, wenn eine Anwendung versucht,   Last in einer Klasse durch die Zeichenfolge   Name:

     
      
  • Die forName Methode in der Klasse Class.
  •   
  • Die findSystemClass Methode in der Klasse ClassLoader.
  •   
  • Die loadClass Methode in der Klasse ClassLoader.
  •   
     

aber keine Definition für die Klasse mit   der angegebene Name nicht gefunden werden.

NoClassDefFoundError :

  

ausgelöst, wenn die Java Virtual Machine oder   ein ClassLoader Beispiel versucht zu laden,   in der Definition einer Klasse (als Teil   eines normalen Methodenaufruf oder als Teil   Erstellen einer neuen Instanz der neuen Verwendung von   expression) und keine Definition der   Klasse nicht gefunden werden.

     

Die gesuchte für Klassendefinition   zur Zeit vorhanden war, als die Ausführung   Klasse kompiliert wurde, aber die Definition   nicht mehr gefunden werden kann.

So scheint es, dass der NoClassDefFoundError tritt auf, wenn die Quelle erfolgreich kompiliert wurde, aber zur Laufzeit wurden die erforderlichen class Dateien nicht gefunden. Dies kann etwas sein, das in der Verteilung oder die Produktion von JAR-Dateien passieren kann, wo nicht alle erforderlichen class Dateien enthalten waren.

Wie bei ClassNotFoundException, es scheint, dass sie von dem Versuch stammen können reflektierende Anrufe Klassen zur Laufzeit zu machen, aber die Klassen das Programm versucht wird zu nennen ist nicht vorhanden.

Der Unterschied zwischen den beiden ist, dass man ein Error ist und das andere ist ein Exception. Mit NoClassDefFoundError ist ein Error und es ergibt sich aus der Java Virtual Machine, den Problemen eine Klasse zu finden, um es zu finden erwartet. Ein Programm, das erwartet wurde zur Compile-Zeit arbeiten kann wegen class ausführen, um Dateien nicht gefunden wird oder ist nicht das gleiche wie bei der Kompilierung Zeit hergestellt oder angetroffen werden. Das ist ein ziemlich kritischer Fehler, da das Programm nicht von der JVM gestartet werden.

Auf der anderen Seite ist die ClassNotFoundException ein Exception, so ist es etwas zu erwarten, und ist etwas, das einbringbar ist. Reflexion unter Verwendung kann fehleranfällig sein (wie es einige Erwartungen ist, dass die Dinge nicht wie erwartet gehen können. Es gibt keine Kompilierung-Check, um zu sehen, dass alle erforderlichen Klassen vorhanden ist, so dass alle Probleme mit den gewünschten Klassen zu finden, zur Laufzeit angezeigt .

Andere Tipps

Ein ClassNotFoundException ausgelöst wird, wenn die gemeldete Klasse durch den Classloader nicht gefunden wird. Dies bedeutet normalerweise, dass die Klasse von der CLASSPATH fehlt. Es könnte auch bedeuten, dass die betreffende Klasse von einer anderen Klasse geladen werden versucht, die in einem übergeordneten Klassenladeprogramm geladen wurden und damit die Klasse von dem Kind Classloader ist nicht sichtbar. Dies ist manchmal der Fall, wenn in komplexeren Umgebungen wie ein App Server arbeitet (WebSphere für solche Probleme sind berüchtigt Classloader).

Die Menschen neigen oft dazu, java.lang.NoClassDefFoundError mit java.lang.ClassNotFoundException zu verwirren aber es gibt einen wichtigen Unterschied. Zum Beispiel einer Ausnahme (ein Fehler wirklich da java.lang.NoClassDefFoundError ist eine Unterklasse von java.lang.Error) wie

java.lang.NoClassDefFoundError:
org/apache/activemq/ActiveMQConnectionFactory

bedeutet nicht, dass die ActiveMQConnectionFactory Klasse nicht in der CLASSPATH ist. Infact sein ganz im Gegenteil. Es bedeutet, dass die Klasse ActiveMQConnectionFactory durch den Classloader jedoch gefunden wurde beim Versuch, die Klasse zu laden, es lief in einen Fehler die Klassendefinition zu lesen. Dies geschieht in der Regel, wenn die Klasse in Frage statische Blöcke oder Elemente aufweist, die eine Klasse verwenden, ist nicht von den Classloader gefunden. Also die Schuldigen zu finden, sieht die Quelle der betreffenden Klasse (ActiveMQConnectionFactory in diesem Fall) und suchen Sie nach Code mit statischen Blöcken oder statische Mitgliedern. Wenn Sie keinen Zugriff haben, die die Quelle, dann einfach dekompilieren JAD verwendet wird.

Auf den Code untersuchen, sagen Sie wie unten eine einzige Zeile Code zu finden, stellen Sie sicher, dass die Klasse Someclass in Ihrer CLASSPATH.

private static SomeClass foo = new SomeClass();

Tipp: Um herauszufinden, welche jar eine Klasse gehört, können Sie die Website jarFinder verwenden. Auf diese Weise können Sie einen Klassennamen mit Wildcards angeben, und es sucht nach der Klasse in der Datenbank von Gläsern. jarhoo ermöglicht es Ihnen, das gleiche zu tun, aber es ist nicht mehr frei zu verwenden.

Wenn Sie möchten, das finden, das Glas eine Klasse in einem lokalen Pfad gehört, können Sie ein Dienstprogramm wie jarscan verwenden ( http://www.inetfeedback.com/jarscan/ ). Sie legen fest, nur die Klasse, die Sie suchen möchten, und das Root-Verzeichnis Pfad, in dem es für die Klassendateien in Gläsern und zip starten möchten die Suche.

NoClassDefFoundError ist ein Verbindungsfehler im Grunde. Es tritt auf, wenn Sie versuchen, ein Objekt instanziiert (statisch mit „neuen“) und es wird nicht gefunden, wenn es während der Kompilierung war.

ClassNotFoundException ist allgemeiner und ist eine Runtime-Ausnahme, wenn Sie versuchen, eine Klasse zu verwenden, die nicht existiert. Zum Beispiel haben Sie einen Parameter in einer Funktion eine Schnittstelle akzeptiert und jemand geht in einer Klasse, die diese Schnittstelle implementiert, aber Sie haben keinen Zugriff auf die Klasse. Es umfasst auch bei dynamischen Laden von Klassen, wie die Verwendung von loadClass() oder Class.forName().

Ein NoClassDefFoundError (NCDFE) passiert, wenn Ihr Code "neuen Y ()" läuft und es kann die Y-Klasse nicht gefunden.

Es kann einfach sein, dass Y aus dem Klassenlader fehlt wie die anderen Kommentare vorschlagen, aber es könnte sein, dass die Y-Klasse nicht signiert ist oder hat eine ungültige Signatur, oder dass Y von einem anderen Klassenlader geladen ist nicht sichtbar um Ihren Code, oder sogar, dass Y hängt von Z, die für eine der oben genannten Gründe nicht geladen werden kann.

Wenn dies geschieht, dann wird die JVM wird das Ergebnis der Lade X (NCDFE) erinnern und es wird einfach eine neue NCDFE ohne Sie zu sagen jedes Mal, wenn Sie für Y fragen, warum werfen:

class a {
  static class b {}
  public static void main(String args[]) {
    System.out.println("First attempt new b():");
    try {new b(); } catch(Throwable t) {t.printStackTrace();}
    System.out.println("\nSecond attempt new b():");
    try {new b(); } catch(Throwable t) {t.printStackTrace();}
  }
}

speichert diese als a.java irgendwo

Der Code einfach versucht, eine neue Klasse „B“ zweimal, anders als das zu instanziiert, ist es keine Fehler, und es tut nichts.

Kompilieren Sie den Code mit javac a.java, dann ein Lauf durch java -cp . a Aufruf -. Es sollte nur zwei Zeilen Text ausdrucken, und es sollte ohne Fehler gut laufen

Dann löschen Sie die „a $ b.class“ Datei (oder füllen Sie es mit Müll oder kopieren A.class darüber) die fehlende oder beschädigte Klasse zu simulieren. Hier ist, was passiert:

First attempt new b():
java.lang.NoClassDefFoundError: a$b
    at a.main(a.java:5)
Caused by: java.lang.ClassNotFoundException: a$b
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    ... 1 more

Second attempt new b():
java.lang.NoClassDefFoundError: a$b
    at a.main(a.java:7)

Der erste Aufruf führt zu einer ClassNotFoundException (durch den Klassenlader geworfen, wenn es nicht die Klasse finden kann), die in einem ungeprüften NoClassDefFoundError gewickelt werden müssen, da der Code in Frage (new b()) sollte einfach funktionieren.

Der zweite Versuch natürlich scheitern wird auch, aber wie Sie die verpackte Ausnahme sehen kann, ist nicht mehr, weil die Classloader gescheitert Klassenlader zu erinnern scheint. Sie sehen nur die NCDFE mit absolut keine Ahnung, was wirklich passiert ist.

Also, wenn Sie jemals eine NCDFE ohne Ursache sehen, müssen Sie sehen, wenn Sie die Klasse geladen wurde zum ersten Mal zurückverfolgen können die Ursache des Fehlers zu finden.

http://www.javaroots.com/2013/02/classnotfoundexception-vs.html

ClassNotFoundException : tritt auf, wenn Klassenlader nicht die erforderliche Klasse in Klassenpfad finden. Also, im Grunde sollten Sie Ihren Klassenpfad überprüfen und die Klasse im Klassenpfad hinzuzufügen.

NoClassDefFoundError : dies schwieriger zu debuggen und den Grund zu finden. Diese wird ausgelöst, wenn bei der Kompilierung die erforderlichen Klassen vorhanden sind, aber während der Laufzeit werden die Klassen verändert oder entfernt oder Klasse statisch initialisiert warf Ausnahmen. Es bedeutet, dass die Klasse, die in Classpath wird immer geladen vorhanden ist, aber eine der Klassen, die von dieser Klasse erforderlich ist, ist entweder entfernt oder nicht durch den Compiler zu laden. So sollten Sie die Klassen, die auf dieser Klasse abhängig sind.

Beispiel: :

public class Test1
{
}


public class Test 
{
   public static void main(String[] args)
   {
        Test1 = new Test1();    
   }

}

Nun, nachdem sowohl die Klassen kompilieren, wenn Sie Test1.class Datei löschen und Testklasse ausführen, wird es werfen

Exception in thread "main" java.lang.NoClassDefFoundError: Test
    at Test1.main(Test1.java:5)
Caused by: java.lang.ClassNotFoundException: Test
    at java.net.URLClassLoader$1.run(Unknown Source)
    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)
    ... 1 more

ClassNotFoundException. Ausgelöst, wenn eine Anwendung versucht, in einer Klasse durch seinen Namen zu laden, aber keine Definition für die Klasse mit dem angegebenen Namen gefunden wird

NoClassDefFoundError. Geworfen, wenn die Java Virtual Machine versucht, in der Definition einer Klasse und keine Definition der Klasse zu laden gefunden werden

  

Was ist der Grund für jeden von ihnen bekommen und jeden Gedanken Prozess, wie man mit solchen Fehlern umgeht?

Sie sind eng miteinander verbunden. Ein ClassNotFoundException wird ausgelöst, wenn Java Suche ging für eine bestimmte Klasse von Namen und konnte es nicht erfolgreich laden. Ein NoClassDefFoundError ausgelöst wird, wenn Java für eine Klasse ging suchen, der in einigen vorhandenen Code verbunden war, konnte es aber nicht für einen oder anderen Grund (zB falschen Classpath, falsche Version von Java, falscher Version einer Bibliothek) finden und ist gründlich fatal, da es zeigt, dass etwas schief gegangen ist.

Wenn Sie einen C Hintergrund haben, ist ein CNFE wie ein Versager / dlopen() dlsym() und ein NCDFE ist ein Problem, mit dem Linker; im zweiten Fall der betroffenen Klassendateien sollten in der Konfiguration haben versucht man sie eigentlich nie kompiliert zu verwenden.

Beispiel 1:

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

Wenn com/example/Class1 nicht in einem der Klassenpfade vorhanden sind, dann wirft es ClassNotFoundException.

Beispiel 2:

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

Wenn com/example/Class2 existierte, während B kompilieren, aber nicht während der Ausführung gefunden, dann wirft es NoClassDefFoundError.

Beide sind Laufzeit Ausnahmen.

ClassNotFoundException geworfen wird, wenn es versuchen, die Klasse zu laden, indem es über einen String referenzieren. Zum Beispiel, um die Parameter in Class.forName () ist ein String, und dies erhöht das Potential der ungültigen binären Namen der Klassenlader übergeben wird.

Die ClassNotFoundException ausgelöst wird, wenn ein potenziell ungültiger binärer Name gefunden wird; zum Beispiel, wenn der Klassenname die Zeichen ‚/‘ hat, werden Sie eine ClassNotFoundException erhalten gebunden. Es wird auch ausgelöst, wenn die direkt referenzierten Klasse auf dem Classpath nicht verfügbar ist.

Auf der anderen Seite, NoClassDefFoundError geworfen wird

  • , wenn die tatsächliche physische Darstellung der Klasse - die .class-Datei nicht verfügbar ist,
  • oder die Klasse in einem anderen Classloader geladen bereits (in der Regel ein Elternteil Classloader die Klasse geladen haben würde und damit die Klasse kann nicht erneut geladen werden),
  • oder wenn eine inkompatible Klassendefinition ist gefunden worden - der Name in der Klassendatei die gewünschten Namen nicht überein,
  • oder (vor allem), wenn eine abhängige Klasse nicht gefunden und geladen werden. In diesem Fall könnte die direkt referenzierten Klasse befindet und geladen wurde, aber die abhängige Klasse nicht verfügbar ist oder nicht geladen werden kann. Dies ist ein Szenario, in dem die direkt referenzierten Klasse über ein Class.forName oder gleichwertige Verfahren geladen werden. Dies weist auf einen Fehler in Verknüpfung.

Kurz gesagt, ein NoClassDefFoundError in der Regel auf neue () Aussagen oder Methodenaufrufen geworfen, die eine zuvor nicht anwesend Klasse zu laden (im Gegensatz zu dem String-basierten Laden von Klassen für ClassNotFoundException), wenn der Klassenlader nicht in der Lage ist, das zu finden, oder laden Klassendefinition (s).

Schließlich ist es bis zu dem Classloader Implementierung eine Instanz von ClassNotFoundException zu werfen, wenn es sich nicht um eine Klasse zu laden. Die meisten benutzerdefinierten Classloader-Implementierungen führen dies, da sie die URLClassLoader verlängern. Normalerweise Classloader nicht explizit eine NoClassDefFoundError auf eine der Methodenimplementierungen werfen -. Diese Ausnahme wird in der Regel von der JVM in dem HotSpot Compiler geworfen, und nicht durch den Klassenlader selbst

Unterschied zwischen ClassNotFoundException Vs NoClassDefFoundError

 image description hier

  

Mit dem Namen selbst können wir leicht eine Identifizierung von Exception und andere ist von Error.

Ausnahme: Ausnahmen während der Ausführung des Programms auftritt. Ein Programmierer kann diese Ausnahme von Try-Catch-Block behandeln. Wir haben zwei Arten von Ausnahmen. Geprüfte Ausnahme, die bei der Kompilierung führt. Runtime Ausnahmen, die zur Laufzeit ausgelöst werden, diese Ausnahme in der Regel wegen der schlechten Programmierung passieren.

Fehler: Ausnahmen Dies sind überhaupt nicht, es über den Rahmen der Programmierer ist. Diese Fehler werden in der Regel ausgelöst durch JVM.


Bildquelle

Unterschied:

ClassNotFoundException:

  • Class-Loader nicht auf verifizieren eine Klasse Bytecode wir in Link Phase Laden von Klassen-Subsystem erwähnen wir ClassNotFoundException erhalten.
  • ClassNotFoundException ist eine gesichtete Exception direkt von java.lang.Exception Klasse abgeleitet und Sie müssen dafür explizite Handhabung schaffen
  • ClassNotFoundException aufkommt, wenn ein expliziter Laden ist die Klasse wird durch die Bereitstellung Namen der Klasse zur Laufzeit mit ClassLoader.loadClass (), Class.forName () und ClassLoader.findSystemClass () beteiligt.

NoClassDefFoundError:

  • Class-Loader nicht auf Lösung Referenzen einer Klasse in Link Phase Laden von Klassen-Subsystem wir NoClassDefFoundError bekommen.
  • NoClassDefFoundError ist ein Fehler von LinkageError Klasse abgeleitet, die Fehlerfälle, um anzuzeigen, verwendet wird, wobei eine Klasse eine Abhängigkeit von einer anderen Klasse hat und diese Klasse hat incompatibly nach der Erstellung geändert.
  • NoClassDefFoundError ist ein Ergebnis von impliziten Belastungs der Klasse wegen eines Methodenaufrufes von dieser Klasse oder jedem Variablenzugriff.

Similarities:

  • Sowohl NoClassDefFoundError und ClassNotFoundException sind Nichtverfügbarkeit einer Klasse zur Laufzeit bezogen.
  • Sowohl ClassNotFoundException und NoClassDefFoundError sind auf Java Classpath Zusammenhang stehen.

Der Klassenlader sussystem Aktionen Gegeben:

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

Dies ist ein Artikel, der mir sehr geholfen, den Unterschied zu verstehen: http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html

  

Wenn ein Fehler auftritt während des Laden von Klassen, dann einer Instanz eines   Unterklasse von LinkageError muss im Programm an einem Punkt geworfen werden, dass   (Direkt oder indirekt) verwendet die Klasse oder Schnittstelle geladen werden.

     

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

So ein ClassNotFoundException ist eine Ursache von NoClassDefFoundError .
Und ein NoClassDefFoundError ist ein Spezialfall des Typs Ladefehler, die bei Verknüpfung Schritt auftritt.

Ein möglicher Grund in der Praxis hinzufügen:

  • ClassNotFoundException: als cletus gesagt, Sie verwenden Schnittstelle während vererbten Klasse von Schnittstelle nicht im Classpath ist. ZB Service-Provider-Muster (oder Service Locator ) versucht, etwas nicht zu finden -existing Klasse
  • NoClassDefFoundError: gegebene Klasse gefunden wird, während die Abhängigkeit von bestimmten Klasse nicht gefunden

In der Praxis Fehler geworfen werden kann leise , zum Beispiel geben Sie eine Timer Aufgabe und in der Timer Aufgabe es wirft Fehler , während in den meisten Fällen nur Ihr Programm fängt Ausnahme . Dann wird die Timer Hauptschleife wird ohne jegliche Information beendet. Ein ähnlicher Fehler zu NoClassDefFoundError ist ExceptionInInitializerError wenn Ihre statischen Initialisierer oder der Initialisierer für eine statische Variable löst eine Ausnahme aus.

ClassNotFoundException ist eine geprüfte Ausnahme, die auftritt, wenn wir JVM sagen, eine Klasse von seinen string name laden mit Class.forName () oder ClassLoader.findSystemClass () oder ClassLoader.loadClass () -Methoden und erwähnt Klasse nicht im classpath gefunden.

die meiste Zeit tritt diese Ausnahme, wenn Sie versuchen, eine Anwendung auszuführen, ohne den Classpath mit dem erforderlichen JAR-Dateien zu aktualisieren. Zum Beispiel können Sie haben diese Ausnahme zu sehen, wenn der JDBC-Code zu tun, um Ihre Datenbank zu verbinden i.e.MySQL aber Classpath muss nicht JAR für sie.

NoClassDefFoundError Fehler tritt auf, wenn JVM versucht, eine bestimmte Klasse zu laden, die der Teil des Codeausführung ist (als Teil einer normalen Methodenaufruf oder als Teil einer Instanz der Schaffung der neuen Schlüsselwort) und diese Klasse ist in Ihrem classpath nicht vorhanden, aber zum Zeitpunkt der Kompilierung vorhanden war, denn um Ihr Programm auszuführen Sie es kompilieren und wenn Sie versuchen, eine Klasse verwenden, die nicht vorhanden Compiler wird Kompilierungsfehler erhöhen.

Im Folgenden finden Sie eine kurze Beschreibung

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

ich mir folgend wieder erinnern und wieder, wenn ich aktualisieren muß

ClassNotFoundException

Klassenhierarchie

ClassNotFoundException extends ReflectiveOperationException extends Exception extends Throwable

Während das Debuggen

  1. Erforderlich Glas, Klasse aus dem Classpath fehlt.
  2. Überprüfen Sie, ob alle erforderlichen Gläser sind in Classpath von Jvm.

NoClassDefFoundError

Klassenhierarchie

NoClassDefFoundError extends LinkageError  extends Error extends Throwable

Während das Debuggen

  1. Problem mit einer Klasse dynamisch geladen, die richtig kompiliert wurde
  2. Problem mit statischen Blöcke, Konstrukteure, init () Methoden der abhängigen Klasse und der tatsächlichen Fehler wird durch mehrere Schichten gewickelt [vor allem, wenn Sie Feder verwenden, überwintern die tatsächliche Ausnahme gewickelt ist und Sie erhalten NoClassDefError]
  3. Wenn Sie „ClassNotFoundException“ unter einem statischen Block der abhängigen Klasse stellen
  4. Problem mit Versionen der Klasse. Dies geschieht, wenn Sie zwei Versionen v1, v2 von derselben Klasse unter verschiedenen jar / Pakete, die erfolgreich v1 mit kompiliert wurde und v2 wird an der Laufzeit geladen, die nicht die folgenden relevanten Methoden / Vars und Sie werden diese Ausnahme sehen. [Ich einmal dieses Problem gelöst, indem das Duplikat von log4j verwandter Klasse unter mehreren Gläsern zu entfernen, die in dem Classpath erschienen]

ClassNotFoundException und NoClassDefFoundError auftreten, wenn eine bestimmte Klasse nicht bei runtime.However gefunden, treten sie in verschiedenen Szenarien.

ClassNotFoundException ist eine Ausnahme, die auftritt, wenn Sie versuchen, eine Klasse zur Laufzeit mit Class.forName () oder loadclass () -Methoden und genannten Klassen zu laden, werden in der Classpath nicht gefunden.

    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, wenn eine bestimmte Klasse tritt bei der Kompilierung vorhanden ist, aber während der Laufzeit fehlte.

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

Wenn Sie das obige Programm zu kompilieren, zwei Class-Dateien generieren. Eine davon ist A.class und ein anderer ist B.class. Wenn Sie die A.class Datei entfernen und die B.class Datei für Java Runtime-System ausgeführt werden wie unten werfen NoClassDefFoundError:

    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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top