Java.Lang.NoClassDefFoundError behoben: Klassenfehler konnte nicht initialisiert werden
-
Java-Programm mit dem Fehler
Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
-
Mögliche Ursachen für den Fehler
Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
-
Lösung zur Beseitigung des Fehlers
Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
Heute lernen wir einen weiteren Laufzeitfehler kennen: den java.lang.noclassdeffounderror: could not initialize class
. Zuerst werden wir ein Java-Programm mit diesem Fehler durchgehen, was zu einer Diskussion über mögliche Gründe führen wird, und herausfinden, welche Codezeile diesen Fehler verursacht.
Abschließend lernen wir auch die Lösung kennen, um diesen Fehler zu beseitigen.
Java-Programm mit dem Fehler Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
Beispielcode:
public class PropHolder {
public static Properties prop;
static {
// write code to load the properties from a file
}
}
Beispielcode:
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// set your properties here
// save the properties in a file
// Referencing the PropHolder.prop:
Properties prop = PropHolder.prop;
// print the values of all properties
}
}
Hier haben wir zwei .java
-Klassen namens PropHolder
und Main
. Die Klasse PropHolder
lädt die Eigenschaften aus der angegebenen Datei, während die Klasse Main
sie setzt und in einer Datei speichert.
Es verweist auch auf die Variable prop
der Klasse PropHolder
, um die Werte aller Eigenschaften zu drucken.
Dieser Java-Code funktioniert gut, wenn wir ihn auf unserem lokalen Computer ausführen, aber er funktioniert nicht, wenn er mit einem Skript auf einem Linux-Server bereitgestellt wird. Wieso ist es so? Lassen Sie uns die Gründe herausfinden.
Mögliche Ursachen für den Fehler Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
Denken Sie zunächst daran, dass das Erhalten des java.lang.NoClassDefFoundError
nicht nur bedeutet, dass unsere Klasse fehlt. Wenn dem so ist, erhalten wir die java.lang.ClassNotFoundException
.
Es bedeutet auch nicht, dass der Bytecode (.class
) fehlt (in diesem Fall würden wir einen Fehler wie diesen java.lang.NoClassDefFoundError: classname
erhalten).
Der Fehler java.lang.noclassdeffounderror: could not initialize class
unseres Servers bedeutet also, dass er die Klassendatei nicht finden kann. Dies kann verschiedene Gründe haben, die unten aufgeführt sind.
-
Das Problem kann im Block
static
liegen (auchstatischer
Initialisierer genannt). Es würde mit einer nicht abgefangenen Ausnahme auftreten, auftreten und bis zu einem tatsächlichenClassLoader
weitergegeben werden, der versucht, eine Klasse zu laden. -
Wenn die Ausnahme nicht auf den
statischen
Block zurückzuführen ist, kann dies beim Erstellen einerstatischen
Variablen mit dem NamenPropHolder.prop
der Fall sein. -
Möglicherweise ist die
Class
im angegebenen JavaCLASSPATH
nicht vorhanden. -
Möglicherweise haben wir unser Java-Programm mit dem Befehl
jar
ausgeführt, während dieClass
nicht im AttributClassPath
der DateiMANIFEST
definiert war. -
Dieser Fehler kann durch ein Startskript verursacht werden, das die Umgebungsvariable
CLASSPATH
überschreibt. -
Ein weiterer Grund könnte das Fehlen einer Abhängigkeit sein. Beispielsweise ist die native Bibliothek möglicherweise nicht verfügbar, weil
NoClassDefFoundError
die untergeordnete Klasse vonjava.lang.LinkageError
ist. -
Wir können auch in unserer
log
-Datei nachjava.lang.ExceptionInInitializerError
suchen, da die Möglichkeit besteht, dass derNoClassDefFoundError
aufgrund des Fehlschlagens derstatischen
Initialisierung aufgetreten ist. -
Wenn einer von Ihnen in der J2EE-Umgebung arbeitet, kann die Sichtbarkeit der
Class
in verschiedenenClassLoadern
den Fehlerjava.lang.NoClassDefFoundError
verursachen. -
Manchmal verursacht es aufgrund von JRE/JDK-Versionsfehlern.
-
Es kann auch auftreten, wenn wir etwas auf unserer Maschine mit, sagen wir, OpenJDK Version 8.x.x kompilieren. Wir pushen/commiten, aber jemand anderes hat sein
JAVA_HOME
auf eine 11.x-JDK-Version konfiguriert.Hier können wir
ClassNotFoundError
,NoClassDefFoundError
usw. erhalten. Es ist also besser zu überprüfen, mit welchem JDK das Programm kompiliert wurde.
Lösung zur Beseitigung des Fehlers Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
In unserem Fall ist der ClassLoader
beim Lesen der Klassendefinition auf den Fehler gestoßen, als er versuchte, die Klasse zu lesen. Das Einfügen eines try-catch
-Blocks in den statischen Initialisierer löst das Problem.
Denken Sie daran, wenn wir dort einige Dateien lesen, würde sich dies von unserer lokalen Umgebung unterscheiden.
Beispielcode:
// import libraries
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
// PropHolder Class
public class PropHolder {
// static variable of type Properties
public static Properties prop;
// static block, which loads the properties
// from the specified file
static {
try {
InputStream input = new FileInputStream("properties");
prop = new Properties();
prop.load(input);
} catch (FileNotFoundException ex) {
Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
}
} // end static block
} // end PropHolder class
In der obigen Klasse haben wir eine statische Variable namens prop
vom Typ Properties
erstellt, die wir im Block static
verwenden. Innerhalb des static
-Blocks haben wir ein Objekt des FileInputStream
erstellt, das die Eingabebytes aus einer angegebenen Datei im Dateisystem bezieht.
Als nächstes haben wir die Variable prop
initialisiert, indem wir den Konstruktor der Klasse Properties
aufgerufen haben, der verwendet wird, um die Eigenschaften aus einer angegebenen Datei zu laden. Denken Sie daran, dass dieser statische
Block nur ausgeführt wird, wenn wir die Anwendung ausführen.
Beispielcode:
// import libraries
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
// Main Class
public class Main {
// main()
public static void main(String[] args) {
/*
instantiate the Properties class, set various
properties and store them in a given file
*/
Properties prop = new Properties();
prop.setProperty("db.url", "localhost");
prop.setProperty("db.user", "user");
prop.setProperty("db.password", "password");
try {
OutputStream output = new FileOutputStream("properties");
prop.store(output, null);
} catch (FileNotFoundException ex) {
Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(PropHolder.class.getName()).log(Level.SEVERE, null, ex);
}
/*
reference the `PropHolder.prop` to access the values of
the properties that we set previously
*/
Properties obj = PropHolder.prop;
System.out.println(obj.getProperty("db.url"));
System.out.println(obj.getProperty("db.user"));
System.out.println(obj.getProperty("db.password"));
} // end main()
} // end Main
In der Klasse Main
instanziieren wir die Klasse Properties
, um Werte für verschiedene Eigenschaften zu setzen und sie in der angegebenen Datei zu speichern. Als nächstes verweisen wir auf die PropHolder.prop
, um auf die Werte der Eigenschaften db.url
, db.user
und db.password
zuzugreifen und sie wie folgt auf der Programmausgabekonsole auszugeben.
AUSGANG:
localhost
user
password
Verwandter Artikel - Java Error
- Adresse wird bereits verwendet JVM_Bind-Fehler in Java
- Android Java.Lang.IllegalStateException behoben: Methode der Aktivität konnte nicht ausgeführt werden
- Ausnahme im Hauptthread Java.Lang.ClassNotFoundException in IntelliJ IDEA
- Ausnahme im Hauptthread Java.Lang.NoClassDefFoundError
- Beheben Sie das Problem, dass Java nicht installiert werden kann. Es gibt Fehler in den folgenden Schaltern
- Beheben Sie den Fehler `Es wurde keine Java Virtual Machine gefunden` in Eclipse