So beheben Sie den Fehler 'cannot access class'

JavaBeginner
Jetzt üben

Einführung

Im Java-Programmieren ist der Fehler 'cannot access class' (Klasse kann nicht zugegriffen werden) eine häufige Herausforderung, mit der Entwickler konfrontiert werden. Dieser Fehler tritt auf, wenn Ihr Code versucht, eine Klasse zu verwenden, auf die aus verschiedenen Gründen nicht zugegriffen werden kann. Das Verständnis dieses Fehlers ist für das Schreiben effektiver Java-Anwendungen unerlässlich.

In diesem praktischen Lab werden Sie die Ursachen des Fehlers 'cannot access class' kennenlernen und praktische Lösungen zu dessen Behebung implementieren. Durch die Arbeit mit realen Beispielen erwerben Sie wertvolle Fähigkeiten zur Diagnose und Behebung von Zugriffsproblemen in Ihrem Java-Code.

Erstellen eines Java-Projekts mit einem 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) Fehler

In diesem Schritt erstellen Sie eine Java-Projektstruktur und stoßen auf einen realen 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) Fehler. Dies hilft Ihnen zu verstehen, wie der Fehler in der Praxis auftritt.

Einrichten der Projektstruktur

Überprüfen Sie zunächst, ob Sie sich im Projektverzeichnis befinden, indem Sie den folgenden Befehl im Terminal ausführen:

pwd

Sie sollten die folgende Ausgabe sehen:

/home/labex/project

Das Setup-Skript hat bereits eine grundlegende Java-Projektstruktur für Sie erstellt. Lassen Sie uns diese mit dem folgenden Befehl untersuchen:

ls -la

Sie sollten eine ähnliche Ausgabe sehen wie:

total 12
drwxr-xr-x 4 labex labex 4096 May  5 10:00 .
drwxr-xr-x 5 labex labex 4096 May  5 10:00 ..
drwxr-xr-x 2 labex labex 4096 May  5 10:00 bin
-rwxr-xr-x 1 labex labex  105 May  5 10:00 compile.sh
-rwxr-xr-x 1 labex labex   64 May  5 10:00 run.sh
drwxr-xr-x 3 labex labex 4096 May  5 10:00 src

Erstellen von Java-Klassen

Lassen Sie uns nun zwei Java-Klassen erstellen, die den 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) Fehler demonstrieren.

Erstellen Sie zuerst eine Helper-Klasse im Paket com.example.util. Öffnen Sie die Datei, indem Sie im WebIDE-Dateiexplorer zu ihr navigieren oder den folgenden Befehl verwenden:

mkdir -p src/main/java/com/example/util

Navigieren Sie in der WebIDE zu src/main/java/com/example/util und erstellen Sie eine neue Datei namens Helper.java. Fügen Sie den folgenden Code hinzu:

package com.example.util;

class Helper {
    public void helperMethod() {
        System.out.println("This is a helper method.");
    }
}

Beachten Sie, dass diese Klasse den Standard-Zugriffsmodifizierer (package-private) hat, was bedeutet, dass nur innerhalb desselben Pakets auf sie zugegriffen werden kann.

Erstellen Sie als Nächstes eine Main-Klasse im Paket com.example.app, die versucht, auf die Helper-Klasse zuzugreifen. Navigieren Sie in der WebIDE zu src/main/java/com/example/app und erstellen Sie eine neue Datei namens Main.java. Fügen Sie den folgenden Code hinzu:

package com.example.app;

import com.example.util.Helper;

public class Main {
    public static void main(String[] args) {
        System.out.println("Attempting to access the Helper class...");

        // Try to create an instance of the Helper class
        Helper helper = new Helper();
        helper.helperMethod();

        System.out.println("Successfully accessed the Helper class!");
    }
}

Kompilieren und Beobachten des Fehlers

Versuchen Sie nun, Ihr Java-Projekt mit dem bereitgestellten Skript zu kompilieren:

./compile.sh

Sie sollten eine Fehlermeldung ähnlich der folgenden sehen:

src/main/java/com/example/app/Main.java:3: error: cannot access Helper
import com.example.util.Helper;
                      ^
  class file for com.example.util.Helper not found
src/main/java/com/example/app/Main.java:9: error: cannot find symbol
        Helper helper = new Helper();
        ^
  symbol:   class Helper
  location: class Main
src/main/java/com/example/app/Main.java:9: error: cannot find symbol
        Helper helper = new Helper();
                            ^
  symbol:   class Helper
  location: class Main
3 errors

Dies ist der 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) Fehler. Obwohl wir die Helper-Klasse erstellt haben, kann die Main-Klasse nicht darauf zugreifen, da die Helper-Klasse den Standard-Zugriffsmodifizierer hat, wodurch sie nur innerhalb ihres eigenen Pakets zugänglich ist.

Im nächsten Schritt erfahren Sie, wie Sie diese Art von Zugriffsproblem identifizieren und beheben können.

Verstehen und Beheben von Zugriffsmodifizierer-Problemen

Im vorherigen Schritt sind Sie auf den Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) gestoßen, da die Helper-Klasse den Standardzugriff (package-private) hatte. Lassen Sie uns die Java-Zugriffsmodifizierer verstehen und dieses Problem beheben.

Verstehen von Java-Zugriffsmodifizierern

Java bietet vier Arten von Zugriffsmodifizierern:

  1. private: Nur innerhalb derselben Klasse zugänglich
  2. default (kein Modifizierer): Nur innerhalb desselben Pakets zugänglich
  3. protected: Innerhalb desselben Pakets und von Unterklassen zugänglich
  4. public: Von überall zugänglich

In unserem Fall hat die Helper-Klasse den Standard-Zugriffsmodifizierer, was bedeutet, dass nur innerhalb des Pakets com.example.util auf sie zugegriffen werden kann. Da sich unsere Main-Klasse im Paket com.example.app befindet, kann sie nicht auf die Helper-Klasse zugreifen.

Beheben des Zugriffsmodifizierer-Problems

Um dieses Problem zu beheben, müssen Sie den Zugriffsmodifizierer der Helper-Klasse von default auf public ändern. Öffnen Sie die Datei Helper.java in der WebIDE und ändern Sie sie wie folgt:

package com.example.util;

public class Helper {
    public void helperMethod() {
        System.out.println("This is a helper method.");
    }
}

Beachten Sie die Hinzufügung des Schlüsselworts public vor der class-Deklaration. Dadurch ist die Helper-Klasse von jedem Paket aus zugänglich.

Erneutes Kompilieren und Testen der Lösung

Kompilieren Sie nun Ihr Java-Projekt erneut:

./compile.sh

Wenn die Kompilierung erfolgreich ist, werden keine Fehlermeldungen angezeigt. Lassen Sie uns die Anwendung ausführen, um zu überprüfen, ob sie korrekt funktioniert:

./run.sh

Sie sollten die folgende Ausgabe sehen:

Attempting to access the Helper class...
This is a helper method.
Successfully accessed the Helper class!

Diese Ausgabe bestätigt, dass unsere Main-Klasse jetzt auf die Helper-Klasse zugreifen und ihre Methode aufrufen kann.

Verstehen der Lösung

Durch die Änderung des Zugriffsmodifizierers der Helper-Klasse von default auf public haben wir sie von jedem Paket aus zugänglich gemacht, einschließlich des Pakets com.example.app, in dem sich unsere Main-Klasse befindet.

Dies ist eine gängige Lösung für den Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden), wenn Sie von einem anderen Paket aus auf eine Klasse zugreifen müssen. Denken Sie daran: Wenn Sie möchten, dass eine Klasse von außerhalb ihres Pakets zugänglich ist, müssen Sie sie als public deklarieren.

Im nächsten Schritt erfahren Sie mehr über eine weitere häufige Ursache des Fehlers 'Cannot Access Class' (Klasse kann nicht zugegriffen werden): eine falsche Paketstruktur.

Beheben von Paketstrukturproblemen

Eine weitere häufige Ursache für den Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) ist eine falsche Paketstruktur. In diesem Schritt erfahren Sie, wie Sie Paketstrukturprobleme in Java identifizieren und beheben können.

Verstehen der Paketstruktur in Java

In Java muss die Paketstruktur mit der Verzeichnisstruktur übereinstimmen. Beispielsweise muss sich eine Klasse im Paket com.example.util im Verzeichnis com/example/util befinden.

Wenn die physische Verzeichnisstruktur nicht mit der Paketdeklaration übereinstimmt, tritt der Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) auf, selbst wenn die Zugriffsmodifizierer korrekt sind.

Erstellen einer Klasse mit einem Paketstrukturproblem

Lassen Sie uns eine neue Java-Klasse mit einer falschen Paketdeklaration erstellen, um dieses Problem zu demonstrieren. Erstellen Sie eine neue Datei namens Logger.java im Verzeichnis src/main/java/com/example/util mit folgendem Inhalt:

package com.example.logger; // Incorrect package declaration

public class Logger {
    public void log(String message) {
        System.out.println("LOG: " + message);
    }
}

Beachten Sie, dass die Paketdeklaration com.example.logger lautet, die Datei sich aber im Verzeichnis com/example/util befindet. Diese Diskrepanz führt zu einem Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden).

Erstellen Sie nun eine neue Datei namens LogTest.java im Verzeichnis src/main/java/com/example/app, die versucht, die Logger-Klasse zu verwenden:

package com.example.app;

import com.example.logger.Logger;

public class LogTest {
    public static void main(String[] args) {
        Logger logger = new Logger();
        logger.log("Testing logger");
    }
}

Kompilieren und Beobachten des Fehlers

Versuchen Sie, Ihr Java-Projekt zu kompilieren:

./compile.sh

Sie sollten eine Fehlermeldung ähnlich der folgenden sehen:

src/main/java/com/example/app/LogTest.java:3: error: package com.example.logger does not exist
import com.example.logger.Logger;
                        ^
src/main/java/com/example/app/LogTest.java:6: error: cannot find symbol
        Logger logger = new Logger();
        ^
  symbol:   class Logger
  location: class LogTest
src/main/java/com/example/app/LogTest.java:6: error: cannot find symbol
        Logger logger = new Logger();
                            ^
  symbol:   class Logger
  location: class LogTest
3 errors

Dieser Fehler tritt auf, weil der Compiler die Logger-Klasse im Paket com.example.logger nicht finden kann, da es dieses Paket nicht gibt oder die Verzeichnisstruktur nicht mit der Paketdeklaration übereinstimmt.

Beheben des Paketstrukturproblems

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. Ändern Sie die Paketdeklaration so, dass sie mit der Verzeichnisstruktur übereinstimmt.
  2. Verschieben Sie die Datei in eine Verzeichnisstruktur, die mit der Paketdeklaration übereinstimmt.

Verwenden wir den ersten Ansatz. Öffnen Sie die Datei Logger.java und ändern Sie die Paketdeklaration so, dass sie mit der Verzeichnisstruktur übereinstimmt:

package com.example.util; // Correct package declaration

public class Logger {
    public void log(String message) {
        System.out.println("LOG: " + message);
    }
}

Aktualisieren Sie außerdem die Importanweisung in der Datei LogTest.java:

package com.example.app;

import com.example.util.Logger; // Updated import

public class LogTest {
    public static void main(String[] args) {
        Logger logger = new Logger();
        logger.log("Testing logger");
    }
}

Erneutes Kompilieren und Testen der Lösung

Kompilieren Sie nun Ihr Java-Projekt erneut:

./compile.sh

Die Kompilierung sollte jetzt ohne Fehler erfolgreich sein. Erstellen wir ein einfaches Skript, um die Klasse LogTest auszuführen:

echo "java -cp bin com.example.app.LogTest" > ./runlog.sh
chmod +x ./runlog.sh

Führen Sie nun die Klasse LogTest aus:

./runlog.sh

Sie sollten die folgende Ausgabe sehen:

LOG: Testing logger

Dies bestätigt, dass unsere LogTest-Klasse jetzt auf die Logger-Klasse zugreifen kann, da die Paketdeklaration mit der Verzeichnisstruktur übereinstimmt.

Verstehen der Lösung

Wenn Sie auf einen Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) stoßen, überprüfen Sie immer Folgendes:

  1. Die Paketdeklaration in der Quelldatei stimmt mit der Verzeichnisstruktur überein.
  2. Die Importanweisungen verweisen korrekt auf das Paket, in dem sich die Klasse befindet.

Durch die Sicherstellung, dass diese beiden Bedingungen erfüllt sind, können Sie viele Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) in Ihren Java-Projekten vermeiden.

Umgang mit Importanweisungs-Problemen

In diesem letzten Schritt erfahren Sie, wie Sie Fehler vom Typ 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) identifizieren und beheben können, die durch fehlende oder falsche Importanweisungen verursacht werden.

Verstehen von Importanweisungen in Java

Importanweisungen teilen dem Java-Compiler mit, wo er Klassen finden kann, die in Ihrem Code verwendet werden. Wenn Sie eine Klasse aus einem anderen Paket verwenden, ohne sie zu importieren, oder wenn Sie sie falsch importieren, tritt der Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) auf.

Erstellen einer Klasse ohne Importanweisungen

Lassen Sie uns eine Klasse erstellen, die Klassen aus anderen Paketen ohne korrekte Importanweisungen verwendet. Erstellen Sie eine neue Datei namens Calculator.java im Verzeichnis src/main/java/com/example/util mit folgendem Inhalt:

package com.example.util;

public class Calculator {
    public int add(int a, int b) {
        return a + b;
    }

    public int subtract(int a, int b) {
        return a - b;
    }
}

Erstellen Sie nun eine neue Datei namens CalculatorDemo.java im Verzeichnis src/main/java/com/example/app, die die Calculator-Klasse verwendet, ohne sie zu importieren:

package com.example.app;

// Missing import for Calculator class

public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator calculator = new Calculator(); // Error: Cannot access Calculator

        int sum = calculator.add(5, 3);
        System.out.println("5 + 3 = " + sum);

        int difference = calculator.subtract(10, 4);
        System.out.println("10 - 4 = " + difference);
    }
}

Kompilieren und Beobachten des Fehlers

Versuchen Sie, Ihr Java-Projekt zu kompilieren:

./compile.sh

Sie sollten eine Fehlermeldung ähnlich der folgenden sehen:

src/main/java/com/example/app/CalculatorDemo.java:6: error: cannot find symbol
        Calculator calculator = new Calculator();
        ^
  symbol:   class Calculator
  location: class CalculatorDemo
src/main/java/com/example/app/CalculatorDemo.java:6: error: cannot find symbol
        Calculator calculator = new Calculator();
                                    ^
  symbol:   class Calculator
  location: class CalculatorDemo
2 errors

Dieser Fehler tritt auf, weil die Klasse CalculatorDemo versucht, die Klasse Calculator zu verwenden, ohne sie zu importieren.

Beheben des Importanweisungs-Problems

Um dieses Problem zu beheben, fügen Sie die richtige Importanweisung zur Datei CalculatorDemo.java hinzu:

package com.example.app;

import com.example.util.Calculator; // Added import statement

public class CalculatorDemo {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();

        int sum = calculator.add(5, 3);
        System.out.println("5 + 3 = " + sum);

        int difference = calculator.subtract(10, 4);
        System.out.println("10 - 4 = " + difference);
    }
}

Erneutes Kompilieren und Testen der Lösung

Kompilieren Sie nun Ihr Java-Projekt erneut:

./compile.sh

Die Kompilierung sollte jetzt ohne Fehler erfolgreich sein. Erstellen wir ein einfaches Skript, um die Klasse CalculatorDemo auszuführen:

echo "java -cp bin com.example.app.CalculatorDemo" > ./runcalc.sh
chmod +x ./runcalc.sh

Führen Sie nun die Klasse CalculatorDemo aus:

./runcalc.sh

Sie sollten die folgende Ausgabe sehen:

5 + 3 = 8
10 - 4 = 6

Dies bestätigt, dass unsere Klasse CalculatorDemo jetzt auf die Klasse Calculator zugreifen kann, da wir die korrekte Importanweisung hinzugefügt haben.

Verstehen der Lösung

Wenn Sie auf einen Fehler 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) stoßen, überprüfen Sie Folgendes:

  1. Sie haben die Klasse importiert, die Sie verwenden möchten.
  2. Die Importanweisung verweist auf das richtige Paket.
  3. Die Klasse, die Sie importieren möchten, ist public (wie wir in Schritt 2 gelernt haben).

Java bietet zwei Möglichkeiten, Klassen zu importieren:

  1. Single-type import (Einzeltyp-Import): import com.example.util.Calculator;
  2. On-demand import (Bedarfs-Import): import com.example.util.*;

Der Einzeltyp-Import wird im Allgemeinen bevorzugt, da er verdeutlicht, welche Klassen verwendet werden. Der Bedarfs-Import (mit dem Platzhalter *) importiert alle Klassen aus einem Paket, was zu Namenskonflikten führen kann, wenn Klassen mit demselben Namen in verschiedenen Paketen existieren.

Indem Sie sicherstellen, dass Ihre Importanweisungen korrekt sind, können Sie viele Fehler vom Typ 'Cannot Access Class' (Klasse kann nicht zugegriffen werden) in Ihren Java-Projekten vermeiden.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Fehler 'cannot access class' (Klasse kann nicht zugegriffen werden) in Java identifizieren und beheben können. Sie verstehen nun die drei Hauptursachen für diesen Fehler:

  1. Access Modifier Issues (Zugriffsmodifizierer-Probleme): Wenn eine Klasse nicht mit dem entsprechenden Zugriffsmodifizierer deklariert wird, kann nicht von bestimmten Orten aus auf sie zugegriffen werden. Wenn Sie eine Klasse public deklarieren, kann von jedem Paket aus auf sie zugegriffen werden.

  2. Package Structure Issues (Paketstruktur-Probleme): Die Paketdeklaration in einer Java-Datei muss mit der Verzeichnisstruktur übereinstimmen. Wenn eine Diskrepanz vorliegt, kann der Compiler die Klasse nicht finden, was zu einem Fehler 'cannot access class' (Klasse kann nicht zugegriffen werden) führt.

  3. Import Statement Issues (Importanweisungs-Probleme): Klassen aus anderen Paketen müssen mithilfe der import-Anweisung korrekt importiert werden. Fehlende oder falsche Importanweisungen führen zu Fehlern vom Typ 'cannot access class' (Klasse kann nicht zugegriffen werden).

Durch das Verständnis dieser Ursachen und ihrer Lösungen können Sie Fehler vom Typ 'cannot access class' (Klasse kann nicht zugegriffen werden) in Ihren Java-Projekten effektiv diagnostizieren und beheben. Dieses Wissen spart Ihnen Zeit und hilft Ihnen, robusteren und wartungsfreundlicheren Java-Code zu schreiben.