677 Stimmen

Warum erhalte ich einen NoClassDefFoundError in Java?

Ich bekomme eine NoClassDefFoundError wenn ich meine Java-Anwendung ausführe. Was ist typischerweise die Ursache dafür?

1 Stimmen

Ich glaube, es kann auch passieren, wenn Sie Ihr Java-Programm nicht mit der richtigen Syntax ausführen. Zum Beispiel müssen Sie Ihre Klasse aus dem Root-Bin-Ordner mit dem vollständigen Paketnamen aufrufen (z. B. my.package.myClass). Ich würde genauer sein, wenn ich könnte, aber ich bin kein großer Java-Kenner. Ich kann mich nur daran erinnern, dass ich das ein paar Mal vermasselt habe.

1052voto

Jared Punkte 24266

Es ist zwar möglich, dass dies auf eine Fehlanpassung des Klassenpfads zwischen Kompilier- und Laufzeit zurückzuführen ist, aber das muss nicht unbedingt der Fall sein.

In diesem Fall ist es wichtig, dass wir zwei oder drei verschiedene Ausnahmen im Kopf behalten:

  1. java.lang.ClassNotFoundException Diese Ausnahme zeigt an, dass die Klasse nicht auf dem Klassenpfad gefunden wurde. Dies bedeutet, dass wir versucht haben, die Klassendefinition zu laden, und die Klasse nicht im Klassenpfad vorhanden war.

  2. java.lang.NoClassDefFoundError Diese Ausnahme zeigt an, dass die JVM in ihrer internen Klassendefinitionsdatenstruktur nach der Definition einer Klasse gesucht und sie nicht gefunden hat. Dies ist etwas anderes als die Aussage, dass die Klasse nicht aus dem Klassenpfad geladen werden konnte. Normalerweise bedeutet dies, dass wir zuvor versucht haben, eine Klasse aus dem Klassenpfad zu laden, was aber aus irgendeinem Grund fehlgeschlagen ist. Jetzt versuchen wir, die Klasse erneut zu verwenden (und müssen sie daher laden, da es beim letzten Mal fehlgeschlagen ist), aber wir werden nicht einmal versuchen, sie zu laden, da das Laden zuvor fehlgeschlagen ist (und wir vermuten, dass es erneut fehlschlagen würde). Der frühere Fehler könnte eine ClassNotFoundException oder ein ExceptionInInitializerError sein (was auf einen Fehler im statischen Initialisierungsblock hinweist) oder eine beliebige Anzahl anderer Probleme. Der Punkt ist, dass ein NoClassDefFoundError nicht unbedingt ein Klassenpfadproblem ist.

60 Stimmen

Vielen Dank für die Erwähnung der Ursache eines NoClassDefFoundError, dies half mir sehr! In meinem Fall wurde zuvor ein ExceptionInInitializerError ausgelöst, so fand ich über Fehler in statischen Blöcken heraus.

0 Stimmen

@Jared, Wenn ich eine Error: Could not find or load main class wird er in welche Fehlerkategorie eingeordnet?

0 Stimmen

@Pops: Ich habe die Sprache ausführlicher gemacht, um die Objekte der Verben "try" anzugeben :)

309voto

Mocky Punkte 7589

Dies wird verursacht, wenn es eine Klassendatei gibt, von der Ihr Code abhängt und die zur Kompilierzeit vorhanden ist, aber zur Laufzeit nicht gefunden wird. Suchen Sie nach Unterschieden in den Klassenpfaden zur Kompilierzeit und zur Laufzeit.

1 Stimmen

Ich hatte diesen Fehler, als ich eine Quelldatei unter dem falschen Namensraum/Package abgelegt habe. I beziffert Ich konnte sie einfach irgendwo einfügen, und der Compiler war zufrieden. Es stellte sich heraus, dass ich mehr Sorgfalt hätte walten lassen sollen, damit auch die Laufzeit zufrieden ist.

2 Stimmen

Ich hatte diesen Fehler einmal, als meinem Server während eines Datei-Uploads der Speicher ausging. Jedes Mal, wenn ich den Upload versuchte, erhielt ich eine andere Fehlermeldung. Schließlich wurde mir mitgeteilt, dass ich nicht genug Heap-Speicher habe.

135 Stimmen

Diese Antwort ist nicht unbedingt richtig und wird für viele Menschen irreführend sein! Siehe die bessere Antwort von Jared unten.

158voto

xli Punkte 2210

Hier ist der Code zur Veranschaulichung java.lang.NoClassDefFoundError . Siehe bitte Jareds Antwort für eine ausführliche Erklärung.

NoClassDefFoundErrorDemo.java

public class NoClassDefFoundErrorDemo {
    public static void main(String[] args) {
        try {
            // The following line would throw ExceptionInInitializerError
            SimpleCalculator calculator1 = new SimpleCalculator();
        } catch (Throwable t) {
            System.out.println(t);
        }
        // The following line would cause NoClassDefFoundError
        SimpleCalculator calculator2 = new SimpleCalculator();
    }

}

SimpleCalculator.java

public class SimpleCalculator {
    static int undefined = 1 / 0;
}

4 Stimmen

Und der Grund ist, dass nach dem ersten Versuch jvm bereits weiß, dass es nicht funktionieren wird und werfen andere Ausnahme zweiten Mal?

1 Stimmen

@ikamen Offenbar hat es irgendwo die fehlgeschlagene Klasseninitialisierung von SimpleCalculator nach der Teilung durch Null? Hat jemand einen Hinweis auf die offizielle Dokumentation für dieses Verhalten?

7 Stimmen

@PhilipRego Bin mir nicht sicher, was Sie mit einem "reinen" NoClassDefFoundError meinen. Das erste Mal new SimpleCalculator() aufgerufen wird, erhalten Sie einen ExceptionInInitializerError mit der Ausprägung ArithmeticException. Beim zweiten Aufruf von new SimpleCalculator() erhalten Sie einen NoClassDefFoundError so rein wie jeder andere. Der Punkt ist, dass Sie einen NoClassDefFoundError aus einem anderen Grund als SimpleCalculator.class nicht auf dem Klassenpfad zur Laufzeit erhalten können.

51voto

Afee Punkte 2639

NoClassDefFoundError in Java

Definition:

  1. Die Java Virtual Machine ist nicht in der Lage, eine bestimmte Klasse zur Laufzeit zu finden, die zur Kompilierzeit verfügbar war.

  2. Wenn eine Klasse beim Kompilieren vorhanden war, aber zur Laufzeit nicht im Java-Klassenpfad verfügbar ist.

enter image description here

Beispiele:

  1. Die Klasse ist nicht im Klassenpfad, es gibt keinen sicheren Weg, um es zu wissen, aber oft können Sie nur einen Blick auf print System.getproperty("java.classpath") und es wird der Klassenpfad von dort können Sie zumindest eine Vorstellung von Ihrer tatsächlichen Laufzeit Klassenpfad zu bekommen.

  2. Ein einfaches Beispiel für einen NoClassDefFoundError ist eine Klasse, die zu einer fehlenden JAR-Datei gehört, oder eine JAR-Datei wurde nicht in den Klassenpfad aufgenommen, oder manchmal wurde der Name des JAR von jemandem geändert, wie in meinem Fall, als einer meiner Kollegen tibco.jar in tibco_v3.jar geändert hat und das Programm mit java.lang.NoClassDefFoundError fehlschlug und ich mich fragte, was los ist.

  3. Versuchen Sie einfach, mit explizit -classpath Option mit dem Klassenpfad, die Sie denken, wird funktionieren und wenn es funktioniert, dann ist es ein sicheres kurzes Zeichen, dass jemand Java-Klassenpfad überschreiben ist.

  4. Ein Problem mit der Berechtigung für eine JAR-Datei kann auch den Fehler NoClassDefFoundError in Java verursachen.

  5. Tippfehler in der XML-Konfiguration können auch NoClassDefFoundError in Java verursachen.

  6. wenn Ihre kompilierte Klasse, die in einem Paket definiert ist, beim Laden nicht im selben Paket vorhanden ist, wie im Fall von JApplet, wird in Java NoClassDefFoundError ausgelöst.

Mögliche Lösungen:

  1. Die Klasse ist nicht im Java-Klassenpfad verfügbar.
  2. Wenn Sie in einer J2EE-Umgebung arbeiten, kann die Sichtbarkeit einer Klasse unter mehreren Classloadern auch zu einem java.lang.NoClassDefFoundError führen, siehe Beispiele und Szenario für eine detaillierte Diskussion.
  3. Prüfen Sie auf java.lang.ExceptionInInitializerError in Ihrer Protokolldatei. NoClassDefFoundError aufgrund der fehlgeschlagenen statischen Initialisierung ist recht häufig.
  4. Da NoClassDefFoundError eine Unterklasse von java.lang.LinkageError ist, kann es auch dazu kommen, wenn eine der Abhängigkeiten, wie z.B. eine native Bibliothek, nicht verfügbar ist.
  5. Jedes Startskript setzt die Umgebungsvariable Classpath außer Kraft.
  6. Möglicherweise führen Sie Ihr Programm mit dem Befehl jar aus und die Klasse wurde nicht im ClassPath-Attribut der Manifestdatei definiert.

Ressourcen:

3 Möglichkeiten zur Lösung von NoClassDefFoundError

java.lang.NoClassDefFoundError Problemmuster

1 Stimmen

Tolle Antwort. Ich glaube, ich habe alles ausprobiert, was Sie vorschlagen und habe immer noch dieses Problem. Ich kann einige davon ausschließen, da das Jar mit Spring funktioniert, aber es scheint, dass es von java.sql nicht gemocht wird (in meinem Fall der Sap-DB-Treiber für Hana).

2 Stimmen

Es heißt eigentlich System.getproperty("java.class.path")

0 Stimmen

Das Problem ist noch nicht gelöst, aber es ist eine sehr nützliche Information.

33voto

shsteimer Punkte 27528

Ich habe festgestellt, dass ich manchmal einen NoClassDefFound-Fehler erhalte, wenn Code mit einer inkompatiblen Version der zur Laufzeit gefundenen Klasse kompiliert wird. Der spezielle Fall, an den ich mich erinnere, betrifft die Apache-Axis-Bibliothek. Es gab tatsächlich 2 Versionen auf meinem Laufzeit-Klassenpfad und es wurde die veraltete und inkompatible Version abgeholt und nicht die richtige, was einen NoClassDefFound-Fehler verursacht. Dies war in einer Befehlszeile app, wo ich einen Befehl ähnlich wie diese verwendet wurde.

set classpath=%classpath%;axis.jar

Ich habe es geschafft, die richtige Version zu finden, indem ich sie benutzt habe:

set classpath=axis.jar;%classpath%;

4 Stimmen

Ich hatte das gleiche Problem. Es stellte sich heraus, dass ich die War-Datei mit Java7 kompiliert hatte, aber meine Tomcat-Installation verwendete Java6. Ich musste meine Umgebungsvariablen aktualisieren

4 Stimmen

Wenn das so passiert, dann sage ich, dass Java im Arsch ist. +2 wenn dies wahr ist. Kann dies noch nicht verifizieren. Wenn es sich als wahr herausstellt, werde ich wieder +1 machen (in den Kommentaren)

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