Was ist Java Lang NoclassDeffoundError?

Was ist Java Lang NoclassDeffoundError?
In der Java.Lang.* Paket, es gibt eine Klasse mit dem Namen NoclassDeffoundError. Die Beschreibung der Klasse ist die Definition der Klasse. NoclassDeffoundError steht für keine Klassendefinition gefundener Fehler. Dies wird geworfen, wenn die Instanz der Java Virtual Machine (JVM) oder eines Classloaders versucht, die Definition einer Klasse zu laden, aber keine Definition der Klasse kann gefunden werden.

Dieser Artikel zeigt, was NoclassDeffoundError ist und liefert Auflösungen. Es liefert zwei wichtige Szenarien für die Ausnahme, die geworfen werden muss, und liefert ihre jeweiligen Vorsätze.

Befehlszeilenszenario

Eine Beispielsituation, in der dies auftreten kann, lautet wie folgt: Angenommen, das Verzeichnis DIR1 gibt. Im Verzeichnis DIR1, der Java -Quelldatei, der Klasse.Java hat die Hauptklasse der Java, Theclass. Jetzt, bei der Eingabeaufforderung, Benutzer@hostname: ~ $, kompiliert der Programmierer die Quelldatei, TheClass.Java mit dem Befehl:

Javac Dir1/Theclass.Java

Die Zusammenstellung wird erfolgreich durchgeführt, um eine Bytecode -Datei zu haben, TheClass.Klasse, die im DIR1 -Verzeichnis produziert wird. Wenn der Programmierer die Datei weiter ausführt.Klasse mit dem folgenden Befehl:

Java Dir1/Theclass

Am Terminal erhielt er die Fehlermeldung:

Fehler: Die Hauptklasse Dir1 konnte oder laden Sie nicht.Die Klasse
Verursacht durch: Java.Lang.NoclassDeffoundError: TheClass (falscher Name: Dir1/Theclass)

Der Programmierer könnte denken, dass dies daran liegt, dass er nicht den gesamten Bytecode -Dateinamen bei der Eingabeaufforderung geschrieben hat. Deshalb könnte er versuchen, das Programm mit dem folgenden Befehl auszuführen:

Java Dir1/Theclass.Klasse

Wenn er das tun würde, würde er die Fehlermeldung erhalten:

Fehler: Die Hauptklasse Dir1 konnte oder laden Sie nicht.Die Klasse.Klasse
Verursacht durch: Java.Lang.ClassNotFoundException: Dir1.Die Klasse.Klasse

Dieser Artikel befindet sich auf NoclassDeffoundError, und so würde ClassNotFoundException nicht behandelt werden. Der Befehl,

Java Dir1/Theclass

soll funktionieren, aber es hat nicht funktioniert. Nach Meinung des Autors liegt das eigentliche Problem in dieser Situation bei der Java -Sprache und nicht der des Programmierers.

NoclassDeffoundError in Java tritt auf, wenn Java Virtual Machine zur Laufzeit keine bestimmte Klasse finden kann. Dies kann auch innerhalb eines laufenden Programms geschehen - siehe unten.

Auflösung

Um dieses Problem zu beheben, gehen Sie in das Verzeichnis DIR1 und führen Sie das Programm mit den folgenden Befehlen am Terminal aus dem Benutzerverzeichnis aus:

CD DIR1
Java Theclass

Fehlendes Bytecode -Klassenszenario

In diesem Abschnitt wird der Verzeichnisbenutzer@hostname: ~/dir1 $ exklusiv verwendet. Betrachten Sie das folgende Java -Programm:

Klasse aclass

public class montclass
public static void main (String [] args)
ACLASS OBJ = New Aclass ();

Angenommen, dies befindet sich in einer Datei und speichert mit dem Namen, Mainclass.Java im Verzeichnis, Benutzer@hostname: ~/dir1 $. Der folgende Befehl erstellt die Datei:

Benutzer@hostname: ~/dir1 $ javac montclass.Java

Das Ergebnis sind zwei Dateien, Mainclass.Java und Mainclass.Klasse im selben Verzeichnis, Dir1. Hauptklasse.Java ist die Quelldatei und die Hauptklasse.Klasse ist die Bytecode -Datei. Um ein Programm in Java auszuführen, ist es die Byte -Code -Datei, die ausgeführt wird. Der folgende Befehl am Terminal führt das Programm aus:

Benutzer@hostname: ~/dir1 $ java montclass

Beachten Sie, dass ".Klasse ”wird nicht tippt, obwohl es seine Datei ist, die engagiert ist. Es sollte keine Ausgabe geben, da im Programm keinen Druckbefehl vorhanden ist. Es sollte nur die neue Eingabeaufforderung geben, die darauf hinweist, dass die Mainclass -Klasse das Programm erfolgreich ausgeführt hat. So funktioniert Java.

Die Klassen als zwei Dateipaare haben

Die beiden oben genannten Klassen können als zwei verschiedene Quelldateien mit den Namen ACLASS gespeichert werden.Java und Theclass.Java. Eine Klasse.Java hätte den Code für Aclass und Theclass.Java hätte den Code für Maordand.

Wenn sich diese beiden Dateien in demselben Verzeichnis befinden, DIR1, nur die Klasse.Java muss im Kompilierungskommando sein. Es würde Aclas integrieren.Java . Der folgende Befehl reicht aus:

Benutzer@hostname: ~/dir1 $ javac theclass.Java

Im Verzeichnis, DIR1, werden zwei neue Dateien auftreten: TheClass.Klasse und Aclas.Klasse . Dies sind Bytecode -Dateien. Die Klasse.Die Klasse entspricht der Klasse.Java und Aclass.Die Klasse entspricht der Klasse.Klasse.

Nun, um das Programm auszuführen, nur die Klasse.Die Klassendatei muss befohlen werden (ohne Erweiterung “.Klasse"). Es wird die Bytecode -Datei ACLASS integriert.Klasse. Der folgende Befehl reicht aus, um die Klasse auszuführen:

Benutzer@hostname: ~/dir1 $ java theclass

Wie zuvor gibt es keine Ausgabe. Die neue Eingabeaufforderung sollte angezeigt werden und zeigt, dass das Programm erfolgreich ausgeführt wurde.

NoclassDeffoundError in Java tritt auf, wenn Java Virtual Machine zur Laufzeit keine bestimmte Klasse finden kann. Dies kann auch in einem laufenden Programm geschehen, wie es in diesem Abschnitt dargestellt wird.

Nun, Aclass.Klasse ist ein wesentlicher Bestandteil der Klasse.Klasse. Mit anderen Worten, die Klasse.Klasse kann nicht ohne Aclass laufen.Klasse. Also, wenn Aclas.Die Klasse wird gelöscht oder umbenannt, NoclassDeffoundError würde geworfen werden. Die Terminalfehleranzeige für den obigen Befehl wäre:

Ausnahme im Thread "Haupt" Java.Lang.NoclassDeffoundError: Aclass
In der Klasse.Haupt (TheClass.Java: 9)
Verursacht durch: Java.Lang.ClassNotFoundException: Aclass
bei Java.Basis/JDK.intern.Lader.Integriert.LOADCASS (integriertinClassloader.Java: 581)
bei Java.Basis/JDK.intern.Lader.Classloader $ AppClassloader.LoadClass (Klassenloader.Java: 178)
bei Java.Basis/Java.Lang.Klassenloader.LoadClass (Classloader.Java: 522)
… 1 mehr

Auflösung

Dieses Problem kann wie folgt gelöst werden: Wenn die Aclas.Die Klasse wurde von seinem Verzeichnis weggeführt, sie sollte zurückgebracht werden. Wenn es gelöscht wurde, vorausgesetzt, diese Aclas.Java und Aclass.Java wurde nicht gelöscht, dann muss das Programm nur neu kompiliert werden, mit

Benutzer@hostname: ~/dir1 $ javac theclass.Java

und eine neue Aclas.Klasse im Verzeichnis DIR1 würde erstellt. Und der Befehl,

Benutzer@hostname: ~/dir1 $ java theclass

würde die obige lange Fehlermeldung für NoclassDeffoundError nicht ausstellen.

Möglichkeit der Erholung

NoclassDeffoundError ist ein Laufzeitfehler, daher liegt es nicht wirklich vom Programmierer, sich von ihm wiederherzustellen. Wie oben erläutert, ist der beste Weg, um das Problem zu lösen.

Abschluss

In der Java.Lang.* Paket, es gibt eine Klasse mit dem Namen NoclassDeffoundError. Die Beschreibung der Klasse ist die Definition der Klasse. NoclassDeffoundError steht für keine Klassendefinition gefundener Fehler. Dies wird geworfen, wenn die Instanz der Java Virtual Machine (JVM) oder eines Classloaders versucht, die Definition einer Klasse zu laden, aber keine Definition der Klasse kann gefunden werden.

NoclassDeffoundError ist ein Laufzeitfehler, daher liegt es nicht wirklich vom Programmierer, sich von ihm wiederherzustellen. Der beste Weg, um das Problem zu behandeln. Ersetzen Sie jede .Klassendatei; Hier sollte es nicht sein.