Java.Lang.NoClassDefFoundError behoben: Klassenfehler konnte nicht initialisiert werden

Mehvish Ashiq 12 Oktober 2023
  1. Java-Programm mit dem Fehler Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
  2. Mögliche Ursachen für den Fehler Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
  3. Lösung zur Beseitigung des Fehlers Java.Lang.NoClassDefFoundError: Klasse konnte nicht initialisiert werden
Java.Lang.NoClassDefFoundError behoben: Klassenfehler 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.

  1. Das Problem kann im Block static liegen (auch statischer Initialisierer genannt). Es würde mit einer nicht abgefangenen Ausnahme auftreten, auftreten und bis zu einem tatsächlichen ClassLoader weitergegeben werden, der versucht, eine Klasse zu laden.

  2. Wenn die Ausnahme nicht auf den statischen Block zurückzuführen ist, kann dies beim Erstellen einer statischen Variablen mit dem Namen PropHolder.prop der Fall sein.

  3. Möglicherweise ist die Class im angegebenen Java CLASSPATH nicht vorhanden.

  4. Möglicherweise haben wir unser Java-Programm mit dem Befehl jar ausgeführt, während die Class nicht im Attribut ClassPath der Datei MANIFEST definiert war.

  5. Dieser Fehler kann durch ein Startskript verursacht werden, das die Umgebungsvariable CLASSPATH überschreibt.

  6. 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 von java.lang.LinkageError ist.

  7. Wir können auch in unserer log-Datei nach java.lang.ExceptionInInitializerError suchen, da die Möglichkeit besteht, dass der NoClassDefFoundError aufgrund des Fehlschlagens der statischen Initialisierung aufgetreten ist.

  8. Wenn einer von Ihnen in der J2EE-Umgebung arbeitet, kann die Sichtbarkeit der Class in verschiedenen ClassLoadern den Fehler java.lang.NoClassDefFoundError verursachen.

  9. Manchmal verursacht es aufgrund von JRE/JDK-Versionsfehlern.

  10. 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
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Verwandter Artikel - Java Error