Einführung
Beim Arbeiten mit Java ist eine der häufigsten Frustrationen für Entwickler der Fehler 'class not found'. Dieser Fehler tritt auf, wenn die Java Virtual Machine (JVM) eine Klasse, die Ihr Programm zum Ausführen benötigt, nicht finden kann. Egal, ob Sie Anfänger sind oder bereits Erfahrung mit Java haben, das Verständnis, wie man diesen Fehler diagnostiziert und behebt, ist für eine reibungslose Entwicklung unerlässlich.
In diesem Lab lernen Sie, was die Ursachen für den Fehler 'class not found' sind, wie Sie das spezifische Problem in Ihrem Code identifizieren und effektive Lösungen zu dessen Behebung implementieren. Am Ende dieser Sitzung verfügen Sie über das Wissen und die praktische Erfahrung, um diese häufige Hürde in der Java-Programmierung zu überwinden.
Das Java Class Path und die Package-Struktur verstehen
Bevor wir uns mit dem Fehler selbst befassen, wollen wir verstehen, wie Java Klassen organisiert und findet. Diese Grundlage hilft Ihnen, 'class not found'-Fehler besser zu diagnostizieren.
Das Java Class Path
Der Class Path (Klassenpfad) ist ein Parameter, der der Java Virtual Machine (JVM) mitteilt, wo sie nach Klassen und Packages suchen soll. Wenn Sie ein Java-Programm ausführen, sucht die JVM nach Klassen in:
- Dem aktuellen Verzeichnis
- JAR-Dateien, die im Class Path angegeben sind
- Den Standard-Java-Bibliotheken
Erstellen eines einfachen Java-Programms
Lassen Sie uns ein einfaches Java-Programm erstellen, um zu verstehen, wie Java Code kompiliert und ausführt:
Öffnen Sie die WebIDE und erstellen Sie eine neue Datei namens
HelloWorld.javaim Verzeichnis/home/labex/project.Fügen Sie den folgenden Code in die Datei ein:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
- Öffnen Sie ein Terminal und stellen Sie sicher, dass Sie sich im Projektverzeichnis befinden:
cd ~/project
- Kompilieren Sie Ihr Java-Programm mit dem Befehl
javac:
javac HelloWorld.java
- Führen Sie Ihr Programm mit dem Befehl
javaaus:
java HelloWorld
Sie sollten die folgende Ausgabe sehen:
Hello, World!
Den Kompilierungsprozess verstehen
Wenn Sie den Befehl javac ausführen, wird eine Datei namens HelloWorld.class erstellt. Diese Datei enthält den Bytecode, den die JVM ausführen kann. Wenn Sie den Befehl java ausführen, sucht die JVM nach dieser Klassendatei im aktuellen Verzeichnis und führt sie aus.
Die erfolgreiche Ausführung dieses einfachen Programms demonstriert den grundlegenden Kompilierungs- und Ausführungsprozess in Java. Als Nächstes werden wir absichtlich einen Fehler erzeugen, um zu verstehen, was passiert, wenn eine Klasse nicht gefunden wird.
Den 'Class Not Found'-Fehler erkennen und verstehen
Nachdem Sie die Grundlagen der Java-Kompilierung und -Ausführung verstanden haben, wollen wir absichtlich eine Situation schaffen, in der ein 'class not found'-Fehler auftritt. Dies hilft Ihnen, den Fehler zu erkennen und seine Ursachen zu verstehen.
Erstellen eines Programms mit einer fehlenden Klasse
- Erstellen Sie eine neue Datei namens
MainProgram.javaim Verzeichnis/home/labex/projectmit dem folgenden Code:
public class MainProgram {
public static void main(String[] args) {
// Try to use a class that doesn't exist yet
Helper helper = new Helper();
helper.doSomething();
}
}
- Kompilieren Sie dieses Programm mit dem Befehl
javac:
javac MainProgram.java
Sie werden einen Fehler ähnlich dem folgenden sehen:
MainProgram.java:4: error: cannot find symbol
Helper helper = new Helper();
^
symbol: class Helper
location: class MainProgram
Dieser Fehler tritt zur Kompilierungszeit auf, da der Java-Compiler die Klasse Helper nicht finden kann. Lassen Sie uns dies beheben, indem wir die fehlende Klasse erstellen.
Erstellen der fehlenden Klasse
- Erstellen Sie eine neue Datei namens
Helper.javaim selben Verzeichnis mit dem folgenden Code:
public class Helper {
public void doSomething() {
System.out.println("Helper is doing something useful!");
}
}
- Kompilieren Sie nun beide Dateien:
javac MainProgram.java Helper.java
- Führen Sie die Klasse
MainProgramaus:
java MainProgram
Sie sollten die Ausgabe sehen:
Helper is doing something useful!
Laufzeit-'Class Not Found'-Fehler verstehen
Der Fehler, auf den wir zuvor gestoßen sind, war ein Kompilierungsfehler. Lassen Sie uns nun ein Szenario erstellen, in dem wir einen Laufzeit-'class not found'-Fehler erhalten:
- Erstellen Sie eine neue Datei namens
DynamicLoader.javamit dem folgenden Code:
public class DynamicLoader {
public static void main(String[] args) {
try {
// Try to dynamically load a class that doesn't exist
Class.forName("NonExistentClass");
System.out.println("Class loaded successfully!");
} catch (ClassNotFoundException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
- Kompilieren und führen Sie dieses Programm aus:
javac DynamicLoader.java
java DynamicLoader
Sie sollten die Ausgabe sehen:
Error: NonExistentClass
Dies demonstriert einen Laufzeit-'class not found'-Fehler, der von unserem Try-Catch-Block abgefangen wird. In realen Anwendungen tritt diese Art von Fehler häufig auf, wenn:
- Die Klasse existiert, befindet sich aber nicht im Classpath (Klassenpfad)
- Der Klassenname falsch geschrieben wurde oder eine falsche Groß-/Kleinschreibung aufweist
- Die Klasse sich in einem Package (Paket) befindet, die Package-Struktur jedoch falsch ist
Arbeiten mit Java Packages und dem Class Path
Die meisten realen Java-Anwendungen organisieren Klassen in Packages (Pakete). Diese Organisation kann manchmal zu 'class not found'-Fehlern führen, wenn die Package-Struktur nicht korrekt eingerichtet ist oder der Classpath (Klassenpfad) nicht richtig konfiguriert ist.
Erstellen einer Package-Struktur
- Erstellen Sie eine Verzeichnisstruktur für unser Package:
mkdir -p ~/project/com/example/util
- Erstellen Sie eine neue Datei namens
StringUtils.javaim Verzeichnis~/project/com/example/util:
package com.example.util;
public class StringUtils {
public static String reverse(String input) {
StringBuilder reversed = new StringBuilder();
for (int i = input.length() - 1; i >= 0; i--) {
reversed.append(input.charAt(i));
}
return reversed.toString();
}
}
Beachten Sie die package-Deklaration am Anfang der Datei. Diese teilt Java mit, dass diese Klasse zum Package com.example.util gehört.
- Erstellen Sie nun eine Datei namens
PackageDemo.javaim Verzeichnis~/project:
import com.example.util.StringUtils;
public class PackageDemo {
public static void main(String[] args) {
String original = "Hello, Java!";
String reversed = StringUtils.reverse(original);
System.out.println("Original: " + original);
System.out.println("Reversed: " + reversed);
}
}
- Kompilieren Sie beide Dateien aus dem Projektverzeichnis:
cd ~/project
javac com/example/util/StringUtils.java
javac PackageDemo.java
- Führen Sie die Klasse
PackageDemoaus:
java PackageDemo
Sie sollten die Ausgabe sehen:
Original: Hello, Java!
Reversed: !avaJ ,olleH
Behebung häufiger Package-bezogener Fehler
Lassen Sie uns absichtlich einige häufige Fehler erzeugen, um zu lernen, wie man sie behebt:
Fehler 1: Falsche Package-Verzeichnisstruktur
- Erstellen Sie ein neues Verzeichnis und eine Java-Datei mit einer Package-Deklaration, die nicht mit der Verzeichnisstruktur übereinstimmt:
mkdir -p ~/project/wrong/path
- Erstellen Sie eine Datei namens
MisplacedClass.javaim Verzeichnis~/project/wrong/path:
package correct.path;
public class MisplacedClass {
public static void sayHello() {
System.out.println("Hello from MisplacedClass!");
}
}
- Versuchen Sie, diese Datei zu kompilieren:
cd ~/project
javac wrong/path/MisplacedClass.java
Sie werden einen Fehler ähnlich dem folgenden sehen:
wrong/path/MisplacedClass.java:1: error: package correct.path does not exist
package correct.path;
^
Dieser Fehler tritt auf, weil die Package-Deklaration (package correct.path;) nicht mit der Verzeichnisstruktur (wrong/path) übereinstimmt.
Fehler 2: Fehlende Import-Anweisung
- Erstellen Sie eine Datei namens
ImportDemo.javaim Verzeichnis~/project:
// Missing import: import com.example.util.StringUtils;
public class ImportDemo {
public static void main(String[] args) {
// This will cause an error because StringUtils is not imported
String reversed = StringUtils.reverse("Test");
System.out.println(reversed);
}
}
- Versuchen Sie, diese Datei zu kompilieren:
javac ImportDemo.java
Sie werden einen Fehler ähnlich dem folgenden sehen:
ImportDemo.java:5: error: cannot find symbol
String reversed = StringUtils.reverse("Test");
^
symbol: variable StringUtils
location: class ImportDemo
Dieser Fehler tritt auf, weil wir die Klasse StringUtils nicht importiert haben. Um dies zu beheben, fügen Sie die Import-Anweisung hinzu:
import com.example.util.StringUtils;
Das korrekte Verständnis des Java-Package-Systems und des Classpath ist grundlegend, um 'class not found'-Fehler zu vermeiden und zu beheben. Stellen Sie immer sicher, dass Ihre Package-Deklarationen mit Ihrer Verzeichnisstruktur übereinstimmen und dass alle notwendigen Klassen ordnungsgemäß importiert werden.
Verwenden externer JAR-Dateien und Festlegen des Classpath
Viele Java-Anwendungen sind von externen Bibliotheken abhängig, die als JAR-Dateien (Java ARchive) verteilt werden. Wenn diese JAR-Dateien nicht richtig in Ihren Classpath (Klassenpfad) aufgenommen werden, treten 'class not found'-Fehler auf, wenn Sie versuchen, Klassen aus diesen Bibliotheken zu verwenden.
Erstellen einer benutzerdefinierten JAR-Datei
Lassen Sie uns eine einfache JAR-Datei erstellen, um zu verstehen, wie externe Bibliotheken funktionieren:
- Kompilieren Sie zuerst die
StringUtils-Klasse, die wir zuvor erstellt haben:
cd ~/project
javac com/example/util/StringUtils.java
- Erstellen Sie eine JAR-Datei, die diese Klasse enthält:
jar cf utils.jar com/example/util/StringUtils.class
- Überprüfen Sie, ob die JAR-Datei erstellt wurde:
ls -l utils.jar
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
-rw-r--r-- 1 labex labex 1234 Jan 1 12:34 utils.jar
- Erstellen wir nun ein neues Programm, das diese JAR-Datei verwenden wird. Erstellen Sie eine Datei namens
JarDemo.javaim Verzeichnis~/project:
public class JarDemo {
public static void main(String[] args) {
try {
// Try to use a class from our JAR file
Class<?> clazz = Class.forName("com.example.util.StringUtils");
System.out.println("Successfully loaded: " + clazz.getName());
} catch (ClassNotFoundException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
- Kompilieren Sie dieses Programm:
javac JarDemo.java
- Führen Sie das Programm aus, ohne den Classpath anzugeben:
java JarDemo
Sie sollten die Ausgabe sehen:
Error: com.example.util.StringUtils
Dies ist ein 'class not found'-Fehler, da die JVM die Klasse StringUtils nicht finden kann. Die Klasse befindet sich in unserer JAR-Datei, aber wir haben der JVM nicht gesagt, wo sie suchen soll.
Festlegen des Classpath
Um den Fehler zu beheben, müssen wir unsere JAR-Datei in den Classpath aufnehmen:
- Führen Sie das Programm mit der Option
-classpathaus:
java -classpath .:utils.jar JarDemo
Sie sollten jetzt die Ausgabe sehen:
Successfully loaded: com.example.util.StringUtils
Lassen Sie uns die Classpath-Syntax aufschlüsseln:
.bedeutet das aktuelle Verzeichnis (zum Auffinden vonJarDemo.class):ist der Trennzeichen für verschiedene Classpath-Einträge unter Linux/Mac (verwenden Sie;unter Windows)utils.jarist unsere JAR-Datei
Verwenden externer Bibliotheken
Versuchen wir, eine externe Bibliothek aus einem öffentlichen Maven-Repository zu verwenden:
- Laden Sie eine einfache, leichtgewichtige JSON-Bibliothek herunter:
cd ~/project
wget https://repo1.maven.org/maven2/org/json/json/20230618/json-20230618.jar
- Erstellen Sie ein Programm, das diese Bibliothek verwendet. Erstellen Sie eine Datei namens
JsonDemo.java:
import org.json.JSONObject;
public class JsonDemo {
public static void main(String[] args) {
// Create a JSON object
JSONObject json = new JSONObject();
json.put("name", "Java Student");
json.put("age", 25);
json.put("city", "Codeville");
// Print the JSON object
System.out.println(json.toString(2));
}
}
- Kompilieren Sie dieses Programm mit der JSON-Bibliothek im Classpath:
javac -classpath .:json-20230618.jar JsonDemo.java
- Führen Sie das Programm mit der JSON-Bibliothek im Classpath aus:
java -classpath .:json-20230618.jar JsonDemo
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
{
"name": "Java Student",
"age": 25,
"city": "Codeville"
}
Festlegen der CLASSPATH-Umgebungsvariable
Anstatt den Classpath mit jedem Befehl anzugeben, können Sie die Umgebungsvariable CLASSPATH festlegen:
export CLASSPATH=.:utils.jar:json-20230618.jar
Jetzt können Sie die Programme ausführen, ohne den Classpath anzugeben:
java JsonDemo
Dies sollte die gleiche Ausgabe wie zuvor erzeugen.
Denken Sie daran, dass bei Verwendung der CLASSPATH-Umgebungsvariable:
- Sie sich auf alle Java-Programme auswirkt, die in der aktuellen Shell-Sitzung ausgeführt werden
- Sie überschrieben wird, wenn Sie
-classpathin der Befehlszeile angeben - Die Einstellung verloren geht, wenn Sie das Terminal schließen (es sei denn, sie wird einem Startskript hinzugefügt)
Das Verständnis, wie man externe Bibliotheken richtig verwendet und Ihren Classpath einrichtet, ist entscheidend, um 'class not found'-Fehler in realen Java-Anwendungen zu vermeiden.
Häufige 'Class Not Found'-Szenarien und Lösungen
Nachdem Sie die Grundlagen des Java-Classpaths und des Package-Systems verstanden haben, wollen wir uns einige gängige Szenarien ansehen, die zu 'class not found'-Fehlern führen, und wie man diese behebt.
Szenario 1: Tippfehler im Klassennamen
Eine der häufigsten Ursachen für 'class not found'-Fehler ist einfach ein falsch geschriebener Klassenname. Lassen Sie uns dies demonstrieren:
- Erstellen Sie eine Datei namens
TypoDemo.javaim Verzeichnis~/project:
import java.util.Scanner; // Correct import
// import java.util.scanner; // Incorrect import (lowercase 's')
public class TypoDemo {
public static void main(String[] args) {
// Scanner scanner = new scanner(System.in); // Incorrect (lowercase 's')
Scanner scanner = new Scanner(System.in); // Correct
System.out.print("Enter your name: ");
String name = scanner.nextLine();
System.out.println("Hello, " + name + "!");
scanner.close();
}
}
- Kompilieren und führen Sie dieses Programm aus:
javac TypoDemo.java
java TypoDemo
- Wenn Sie dazu aufgefordert werden, geben Sie Ihren Namen ein und drücken Sie die Eingabetaste. Sie sollten eine Begrüßung sehen.
Wenn Sie den falschen Import auskommentieren und den korrekten auskommentieren, erhalten Sie einen Kompilierungsfehler. Denken Sie daran, dass Java Groß- und Kleinschreibung beachtet, also sind Scanner und scanner verschiedene Klassen.
Szenario 2: Vergessen, abhängige Klassen zu kompilieren
Ein weiteres häufiges Szenario ist, wenn Sie vergessen, abhängige Klassen nach Änderungen neu zu kompilieren:
- Aktualisieren Sie die Datei
Helper.java, die wir zuvor erstellt haben:
public class Helper {
public void doSomething() {
System.out.println("Helper is doing something useful!");
}
// Add a new method
public void doSomethingElse() {
System.out.println("Helper is doing something else!");
}
}
- Erstellen Sie eine neue Datei namens
DependencyDemo.java:
public class DependencyDemo {
public static void main(String[] args) {
Helper helper = new Helper();
helper.doSomething();
helper.doSomethingElse();
}
}
- Kompilieren und führen Sie diese Dateien aus:
javac Helper.java
javac DependencyDemo.java
java DependencyDemo
Sie sollten beide Nachrichten von der Klasse Helper sehen.
- Sehen wir uns nun an, was passiert, wenn wir nach Änderungen nicht neu kompilieren. Aktualisieren Sie
Helper.javaerneut:
public class Helper {
public void doSomething() {
System.out.println("Helper is doing something useful!");
}
public void doSomethingElse() {
System.out.println("Helper is doing something else!");
}
// Add another new method
public void doAnotherThing() {
System.out.println("Helper is doing another thing!");
}
}
- Aktualisieren Sie
DependencyDemo.java, ohneHelper.javaneu zu kompilieren:
public class DependencyDemo {
public static void main(String[] args) {
Helper helper = new Helper();
helper.doSomething();
helper.doSomethingElse();
helper.doAnotherThing(); // This will cause an error
}
}
- Versuchen Sie zu kompilieren und auszuführen:
javac DependencyDemo.java
java DependencyDemo
Sie erhalten einen Kompilierungsfehler, der besagt, dass die Methode doAnotherThing() nicht existiert, obwohl wir sie der Klasse Helper hinzugefügt haben. Dies liegt daran, dass wir Helper.java nach den Änderungen nicht neu kompiliert haben.
- Um dies zu beheben, kompilieren Sie beide Dateien neu:
javac Helper.java
javac DependencyDemo.java
java DependencyDemo
Jetzt sollte alles korrekt funktionieren.
Szenario 3: Fehlender JDBC-Treiber
Ein häufiger 'class not found'-Fehler in realen Anwendungen betrifft die Datenbankkonnektivität. Bei Verwendung von JDBC (Java Database Connectivity) benötigen Sie den entsprechenden Treiber für Ihre Datenbank. Lassen Sie uns dies simulieren:
- Erstellen Sie eine Datei namens
JdbcDemo.java:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JdbcDemo {
public static void main(String[] args) {
try {
// This will cause a ClassNotFoundException
Class.forName("com.mysql.jdbc.Driver");
// We won't actually connect to a database in this example
System.out.println("Driver loaded successfully!");
// In a real application, you would connect like this:
// Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
} catch (ClassNotFoundException e) {
System.out.println("Error: JDBC Driver not found - " + e.getMessage());
System.out.println("Solution: Add the MySQL JDBC driver to your classpath");
}
}
}
- Kompilieren und führen Sie dieses Programm aus:
javac JdbcDemo.java
java JdbcDemo
Sie sollten eine Fehlermeldung sehen:
Error: JDBC Driver not found - com.mysql.jdbc.Driver
Solution: Add the MySQL JDBC driver to your classpath
In einer realen Anwendung müssten Sie die entsprechende JDBC-Treiber-JAR-Datei herunterladen und zu Ihrem Classpath hinzufügen.
Zusammenfassung der Lösungen
Hier ist eine Kurzanleitung zur Lösung von 'class not found'-Fehlern:
- Überprüfen Sie die Schreibweise und Groß-/Kleinschreibung: Java beachtet die Groß- und Kleinschreibung.
- Überprüfen Sie die Package-Struktur: Stellen Sie sicher, dass Ihre Packages mit Ihrer Verzeichnisstruktur übereinstimmen.
- Kompilieren Sie abhängige Klassen neu: Nachdem Sie Änderungen an einer Klasse vorgenommen haben, kompilieren Sie sie und alle abhängigen Klassen neu.
- Legen Sie den Classpath richtig fest: Fügen Sie alle notwendigen Verzeichnisse und JAR-Dateien ein.
- Verwenden Sie eine IDE: Moderne IDEs wie IntelliJ IDEA oder Eclipse automatisieren viele dieser Aufgaben.
- Verwenden Sie ein Build-Tool: Maven oder Gradle können Abhängigkeiten für Sie verwalten.
Indem Sie diese gängigen Szenarien und ihre Lösungen verstehen, sind Sie gut gerüstet, um 'class not found'-Fehler in Ihren Java-Anwendungen zu diagnostizieren und zu beheben.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie man den häufigen 'class not found'-Fehler in Java diagnostiziert und behebt. Sie verstehen jetzt:
- Wie der Java-Classpath funktioniert und warum er wichtig ist
- Wie sich die Java-Package-Struktur auf die Verzeichnisstruktur bezieht
- Häufige Ursachen für 'class not found'-Fehler, einschließlich:
- Tippfehler in Klassennamen
- Fehlende Import-Anweisungen
- Falsche Package-Deklarationen
- Vergessen, abhängige Klassen neu zu kompilieren
- Fehlende JAR-Dateien im Classpath
Sie haben auch praktische Lösungen für diese Probleme gelernt:
- Festlegen des Classpath mit der Option
-classpath - Verwenden der
CLASSPATH-Umgebungsvariable - Arbeiten mit JAR-Dateien und externen Bibliotheken
- Ordnungsgemäßes Organisieren von Java-Packages
Mit diesem Wissen können Sie nun selbstbewusst 'class not found'-Fehler in Ihren Java-Anwendungen beheben und lösen, was Zeit spart und Frustration während der Entwicklung reduziert.
Denken Sie daran, dass Übung der Schlüssel zur Beherrschung der Java-Entwicklung ist. Versuchen Sie, komplexere Projekte zu erstellen und absichtlich verschiedene Arten von Fehlern einzuführen, um Ihre Debugging-Fähigkeiten zu verbessern.



