Beheben des Fehlers 'Could Not Find or Load Main Class' in Java

JavaJavaBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Beim Lernen der Java-Programmierung werden Sie unweigerlich verschiedene Fehler und Ausnahmen (Exceptions) begegnen. Ein häufiger Fehler, mit dem viele Anfänger konfrontiert werden, ist der Fehler "Could Not Find or Load Main Class". Dieser Fehler tritt auf, wenn die Java Virtual Machine (JVM) die Klasse, die die main-Methode enthält und als Einstiegspunkt für Ihre Anwendung dient, nicht finden oder laden kann.

In diesem Lab (Praktikum) werden wir die üblichen Ursachen dieses Fehlers untersuchen und verschiedene Ansätze zur Behebung kennenlernen. Indem Sie die zugrunde liegenden Gründe für diesen Fehler verstehen, sind Sie besser gerüstet, ähnliche Probleme in Ihren zukünftigen Java-Programmierprojekten zu bewältigen.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/packages_api("Packages / API") java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") subgraph Lab Skills java/output -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} java/classes_objects -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} java/packages_api -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} java/files -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} java/io -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} java/working -.-> lab-117401{{"Beheben des Fehlers 'Could Not Find or Load Main Class' in Java"}} end

Erstellen eines einfachen Java-Programms

In diesem Schritt werden wir ein einfaches Java-Programm erstellen, um die Grundlagen der Java-Kompilierung und -Ausführung zu verstehen.

  1. Zunächst erstellen wir eine neue Java-Datei. Im WebIDE navigieren Sie zum Projektverzeichnis (~/project) und erstellen eine neue Datei mit dem Namen HelloWorld.java.

  2. Fügen Sie den folgenden Code in die Datei HelloWorld.java ein:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java World!");
    }
}

Lassen Sie uns verstehen, was dieser Code macht:

  • public class HelloWorld: Definiert eine öffentliche Klasse mit dem Namen HelloWorld
  • public static void main(String[] args): Definiert die main-Methode, die der Einstiegspunkt für jede Java-Anwendung ist
  • System.out.println("Hello, Java World!"): Gibt den Text "Hello, Java World!" in die Konsole aus

Der wichtigste Aspekt, den Sie beachten sollten, ist, dass der Klassenname (HelloWorld) mit dem Dateinamen (HelloWorld.java) übereinstimmt. Diese Benennungskonvention ist in Java von entscheidender Bedeutung, und das Nichbefolgen dieser Konvention ist eine häufige Ursache für den Fehler "Could Not Find or Load Main Class".

  1. Speichern Sie die Datei, indem Sie Strg+S drücken oder im Menü auf Datei > Speichern klicken.

Kompilieren und Ausführen Ihres Java-Programms

Nachdem wir unser Java-Programm erstellt haben, müssen wir es kompilieren und ausführen. Die Kompilierung in Java übersetzt Ihren menschenlesbaren Code (Quellcode) in Bytecode, den die Java Virtual Machine (JVM) verstehen kann.

  1. Öffnen Sie im WebIDE ein Terminal (falls noch keines geöffnet ist), indem Sie im Menü auf Terminal > Neues Terminal klicken.

  2. Stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden:

cd ~/project
  1. Kompilieren Sie das Java-Programm mit dem Befehl javac:
javac HelloWorld.java

Wenn Sie keine Ausgabe sehen, bedeutet das, dass die Kompilierung erfolgreich war. Der Kompilierungsprozess erstellt eine Datei namens HelloWorld.class im gleichen Verzeichnis. Diese .class-Datei enthält den Bytecode, den die JVM ausführen kann.

Sie können die Erstellung dieser Datei überprüfen, indem Sie den Inhalt des Verzeichnisses auflisten:

ls

In der Ausgabe sollten sowohl die Datei HelloWorld.java als auch die Datei HelloWorld.class erscheinen:

HelloWorld.class  HelloWorld.java
  1. Führen Sie das kompilierte Programm mit dem Befehl java aus:
java HelloWorld

Sie sollten die folgende Ausgabe sehen:

Hello, Java World!

Dies zeigt an, dass Ihr Programm erfolgreich kompiliert und ausgeführt wurde.

Das Verständnis dieses grundlegenden Workflows ist unerlässlich, bevor wir uns im nächsten Schritt mit dem Fehler "Could Not Find or Load Main Class" befassen.

Verständnis des Fehlers "Could Not Find or Load Main Class"

Nachdem wir die Grundlagen der Kompilierung und Ausführung eines Java-Programms verstanden haben, wollen wir uns nun den Fehler "Could Not Find or Load Main Class" und seine häufigen Ursachen ansehen.

Fehler-Szenario 1: Klassenname stimmt nicht überein

Eine der häufigsten Ursachen für diesen Fehler ist eine Diskrepanz zwischen dem Klassennamen in Ihrem Code und dem Dateinamen.

  1. Erstellen Sie eine neue Datei mit dem Namen NameMismatch.java mit folgendem Inhalt:
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

Beachten Sie, dass der Klassenname (IncorrectName) nicht mit dem Dateinamen (NameMismatch.java) übereinstimmt.

  1. Versuchen Sie, diese Datei zu kompilieren:
javac NameMismatch.java

Die Kompilierung sollte erfolgreich sein, aber es wird eine Datei mit dem Namen IncorrectName.class erstellt (entspricht dem Klassennamen, nicht dem Dateinamen).

  1. Versuchen Sie nun, das Programm mit dem Dateinamen auszuführen:
java NameMismatch

Sie werden den folgenden Fehler sehen:

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. Um diesen Fehler zu beheben, sollten Sie das Programm mit dem korrekten Klassennamen ausführen:
java IncorrectName

Jetzt sollten Sie die folgende Ausgabe sehen:

This program will cause an error!

Fehler-Szenario 2: Ausführung aus dem falschen Verzeichnis

Eine andere häufige Ursache ist der Versuch, eine Java-Klasse aus einem Verzeichnis auszuführen, das die kompilierte .class-Datei nicht enthält.

  1. Erstellen Sie ein Unterverzeichnis für diese Demonstration:
mkdir subdirectory
  1. Wechseln Sie in dieses neue Verzeichnis:
cd subdirectory
  1. Versuchen Sie, das HelloWorld-Programm aus diesem Verzeichnis auszuführen:
java HelloWorld

Sie werden den folgenden Fehler sehen:

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. Um diesen Fehler zu beheben, können Sie entweder:

    • Zum Verzeichnis zurückkehren, das die .class-Datei enthält:
    cd ..
    java HelloWorld
    • Oder den vollständigen Pfad zur Klassen-Datei angeben (was wir in Schritt 5 untersuchen werden)

Wechseln Sie für die nächsten Schritte zurück in das Projektverzeichnis:

cd ~/project

Arbeiten mit Java-Paketen

Pakete in Java werden verwendet, um Klassen in Namespaces (Namensräume) zu organisieren. Sie helfen bei der Verwaltung großer Anwendungen, indem sie Namenskonflikte vermeiden und Zugriffskontrolle ermöglichen. Allerdings kann die falsche Verwendung von Paketen auch zum Fehler "Could Not Find or Load Main Class" führen.

Verständnis der Paketstruktur

  1. Zunächst erstellen wir eine Verzeichnisstruktur für unser Paket. In Java muss die Paketstruktur der Verzeichnisstruktur entsprechen:
mkdir -p ~/project/com/example
  1. Erstellen Sie eine neue Java-Datei mit dem Namen PackagedClass.java im Verzeichnis com/example:
cd ~/project/com/example
  1. Fügen Sie den folgenden Code in die Datei PackagedClass.java ein:
package com.example;

public class PackagedClass {
    public static void main(String[] args) {
        System.out.println("This class is in a package!");
    }
}

Beachten Sie die Deklaration package com.example; am Anfang der Datei. Dies teilt Java mit, dass diese Klasse zum Paket com.example gehört.

  1. Navigieren Sie zurück in das Projektverzeichnis und kompilieren Sie die Datei:
cd ~/project
javac com/example/PackagedClass.java
  1. Wenn Sie versuchen, die Klasse nur mit dem Klassennamen auszuführen, erhalten Sie einen Fehler:
java PackagedClass

Ausgabe:

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. Die korrekte Methode, um eine Klasse in einem Paket auszuführen, ist die Verwendung des vollqualifizierten Klassennamens (einschließlich des Pakets):
java com.example.PackagedClass

Jetzt sollten Sie die folgende Ausgabe sehen:

This class is in a package!

Wichtige Punkte zu Paketen

  • Die Paketdeklaration muss die erste Anweisung in der Datei sein.
  • Die Verzeichnisstruktur muss der Paketstruktur entsprechen.
  • Wenn Sie eine Klasse in einem Paket ausführen, müssen Sie den vollqualifizierten Klassennamen verwenden.
  • Der Kompilierungsbefehl sollte den Pfad zur Quellcode-Datei enthalten, während der Ausführungsbefehl das Paket und den Klassennamen, nicht den Dateipfad, verwenden sollte.

Dieses Paketsystem ist grundlegend für die Java-Entwicklung, insbesondere bei größeren Anwendungen.

Verwenden des Classpaths zur Lösung von Problemen beim Laden von Klassen

Der Classpath (Klassensuchpfad) ist ein Parameter, der der Java Virtual Machine (JVM) mitteilt, wo sie nach Klassen und Paketen suchen soll. Das Verständnis, wie man den Classpath verwendet, ist unerlässlich für die Lösung von Fehlern vom Typ "Could Not Find or Load Main Class", insbesondere in komplexeren Projekten.

Was ist der Classpath?

Der Classpath ist eine Liste von Verzeichnissen, JAR-Dateien und ZIP-Dateien, die Klassen-Dateien enthalten. Die JVM verwendet diese Liste, um nach Klassen zu suchen, wenn sie Ihr Programm lädt und ausführt.

Verwenden des Classpath-Parameters

Erstellen wir eine neue Verzeichnisstruktur, um die Verwendung des Classpaths zu demonstrieren:

  1. Erstellen Sie ein neues Verzeichnis für kompilierte Klassen:
mkdir -p ~/project/classes
  1. Erstellen Sie eine neue Java-Datei namens ClasspathDemo.java im Projektverzeichnis:
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. Kompilieren Sie die Java-Datei und geben Sie an, dass die .class-Datei im classes-Verzeichnis platziert werden soll:
javac -d classes ClasspathDemo.java

Die Option -d gibt das Zielverzeichnis für die kompilierten Klassen-Dateien an. Sie können überprüfen, ob die Klassen-Datei im angegebenen Verzeichnis erstellt wurde:

ls classes

Sie sollten Folgendes sehen:

ClasspathDemo.class
  1. Versuchen Sie nun, das Programm auszuführen, ohne den Classpath anzugeben:
java ClasspathDemo

Sie werden den folgenden Fehler sehen:

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. Um diesen Fehler zu beheben, müssen Sie den Classpath beim Ausführen des Programms angeben:
java -classpath classes ClasspathDemo

Oder Sie können die kürzere Option -cp verwenden:

java -cp classes ClasspathDemo

Jetzt sollten Sie die folgende Ausgabe sehen:

Successfully loaded class using classpath!

Setzen der Classpath-Umgebungsvariable

Anstatt den Classpath jedes Mal anzugeben, wenn Sie ein Java-Programm ausführen, können Sie die Umgebungsvariable CLASSPATH setzen:

export CLASSPATH=~/project/classes:$CLASSPATH

Nachdem Sie diese Umgebungsvariable gesetzt haben, können Sie das Programm ohne die -classpath-Option ausführen:

java ClasspathDemo

Und Sie sollten die gleiche Ausgabe sehen:

Successfully loaded class using classpath!

Wann sollte man den Classpath verwenden?

Sie müssen den Classpath verwenden, wenn:

  • Ihre Klassen nicht im aktuellen Verzeichnis liegen
  • Sie Drittanbieter-Bibliotheken (JAR-Dateien) verwenden
  • Sie eine komplexe Projektstruktur mit mehreren Quellverzeichnissen haben
  • Sie mit Build-Tools wie Maven oder Gradle arbeiten (die den Classpath für Sie verwalten)

Das Verständnis des Classpaths ist für die Java-Entwicklung jenseits einfacher Einzeldatei-Programme von entscheidender Bedeutung und ist oft die Lösung für den Fehler "Could Not Find or Load Main Class" in komplexeren Konfigurationen.

Zusammenfassung

In diesem Lab haben wir den häufigen Fehler "Could Not Find or Load Main Class" in Java untersucht und mehrere Methoden gelernt, um ihn zu beheben. Hier ist eine Zusammenfassung dessen, was wir behandelt haben:

  1. Grundlegende Java-Kompilierung und -Ausführung: Wir haben gelernt, wie man ein einfaches Java-Programm mit den Befehlen javac und java erstellt, kompiliert und ausführt.

  2. Häufige Fehlerursachen:

    • Unstimmigkeit zwischen Klassenname im Code und Dateiname
    • Ausführung aus dem falschen Verzeichnis
    • Falsche Verwendung von Paketen
    • Probleme mit dem Classpath (Klassensuchpfad)
  3. Arbeiten mit Paketen: Wir haben untersucht, wie Pakete in Java funktionieren, einschließlich der Beziehung zwischen Paketstruktur und Verzeichnisstruktur, und wie man Paketklassen korrekt ausführt.

  4. Verwenden des Classpaths: Wir haben gelernt, wie man die Classpath-Option verwendet, um der JVM mitzuteilen, wo sie Klassen finden kann. Dies ist besonders nützlich für komplexe Projekte.

Der Fehler "Could Not Find or Load Main Class" mag zunächst frustrierend erscheinen, aber das Verständnis seiner Ursachen erleichtert die Diagnose und Behebung erheblich. Denken Sie an diese Schlüsselpunkte:

  • Der Klassenname in Ihrem Code muss mit dem Dateinamen (ohne die .java-Erweiterung) übereinstimmen.
  • Wenn Sie Pakete verwenden, muss die Verzeichnisstruktur der Paketstruktur entsprechen.
  • Führen Sie Java-Programme immer aus dem richtigen Verzeichnis aus oder verwenden Sie den Classpath, um anzugeben, wo sich Ihre Klassen befinden.
  • Verwenden Sie für Paketklassen den vollqualifizierten Klassennamen (einschließlich des Pakets), wenn Sie das Programm ausführen.

Durch das Beherrschen dieser Konzepte können Sie diesen häufigen Fehler in Ihrer Java-Entwicklungsreise vermeiden oder schnell beheben.