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 staticliegen (auchstatischerInitialisierer genannt). Es würde mit einer nicht abgefangenen Ausnahme auftreten, auftreten und bis zu einem tatsächlichenClassLoaderweitergegeben werden, der versucht, eine Klasse zu laden.
- 
Wenn die Ausnahme nicht auf den statischenBlock zurückzuführen ist, kann dies beim Erstellen einerstatischenVariablen mit dem NamenPropHolder.propder Fall sein.
- 
Möglicherweise ist die Classim angegebenen JavaCLASSPATHnicht vorhanden.
- 
Möglicherweise haben wir unser Java-Programm mit dem Befehl jarausgeführt, während dieClassnicht im AttributClassPathder DateiMANIFESTdefiniert 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 NoClassDefFoundErrordie untergeordnete Klasse vonjava.lang.LinkageErrorist.
- 
Wir können auch in unserer log-Datei nachjava.lang.ExceptionInInitializerErrorsuchen, da die Möglichkeit besteht, dass derNoClassDefFoundErroraufgrund des Fehlschlagens derstatischenInitialisierung aufgetreten ist.
- 
Wenn einer von Ihnen in der J2EE-Umgebung arbeitet, kann die Sichtbarkeit der Classin verschiedenenClassLoadernden Fehlerjava.lang.NoClassDefFoundErrorverursachen.
- 
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_HOMEauf eine 11.x-JDK-Version konfiguriert.Hier können wir ClassNotFoundError,NoClassDefFoundErrorusw. 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
