Résolution des problèmes de structure de package
Une autre cause courante de l'erreur « Cannot Access Class » est une structure de package incorrecte. Dans cette étape, vous apprendrez à identifier et à résoudre les problèmes de structure de package en Java.
Comprendre la structure de package en Java
En Java, la structure du package doit correspondre à la structure du répertoire. Par exemple, une classe dans le package com.example.util doit être située dans le répertoire com/example/util.
Si la structure physique du répertoire ne correspond pas à la déclaration du package, vous rencontrerez l'erreur « Cannot Access Class », même si les modificateurs d'accès sont corrects.
Création d'une classe avec un problème de structure de package
Créons une nouvelle classe Java avec une déclaration de package incorrecte pour démontrer ce problème. Créez un nouveau fichier nommé Logger.java dans le répertoire src/main/java/com/example/util avec le contenu suivant :
package com.example.logger; // Incorrect package declaration
public class Logger {
public void log(String message) {
System.out.println("LOG: " + message);
}
}
Notez que la déclaration du package est com.example.logger, mais le fichier est situé dans le répertoire com/example/util. Cette incohérence provoquera une erreur « Cannot Access Class ».
Maintenant, créez un nouveau fichier nommé LogTest.java dans le répertoire src/main/java/com/example/app qui tente d'utiliser la classe Logger :
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");
}
}
Compilation et observation de l'erreur
Essayez de compiler votre projet Java :
./compile.sh
Vous devriez voir un message d'erreur similaire à :
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
Cette erreur se produit car le compilateur ne peut pas trouver la classe Logger dans le package com.example.logger, car il n'existe pas de tel package ou la structure du répertoire ne correspond pas à la déclaration du package.
Correction du problème de structure de package
Il existe deux façons de résoudre ce problème :
- Modifier la déclaration du package pour qu'elle corresponde à la structure du répertoire
- Déplacer le fichier vers une structure de répertoire qui correspond à la déclaration du package
Utilisons la première approche. Ouvrez le fichier Logger.java et modifiez la déclaration du package pour qu'elle corresponde à la structure du répertoire :
package com.example.util; // Correct package declaration
public class Logger {
public void log(String message) {
System.out.println("LOG: " + message);
}
}
De plus, mettez à jour l'instruction d'importation dans le fichier 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");
}
}
Recompilation et test de la solution
Maintenant, recompilez votre projet Java :
./compile.sh
La compilation devrait maintenant réussir sans erreurs. Créons un script simple pour exécuter la classe LogTest :
echo "java -cp bin com.example.app.LogTest" > ./runlog.sh
chmod +x ./runlog.sh
Maintenant, exécutez la classe LogTest :
./runlog.sh
Vous devriez voir la sortie suivante :
LOG: Testing logger
Cela confirme que notre classe LogTest peut désormais accéder à la classe Logger car la déclaration du package correspond à la structure du répertoire.
Comprendre la solution
Lorsque vous rencontrez une erreur « Cannot Access Class », vérifiez toujours que :
- La déclaration du package dans le fichier source correspond à la structure du répertoire
- Les instructions d'importation référencent correctement le package où se trouve la classe
En vous assurant que ces deux conditions sont remplies, vous pouvez éviter de nombreuses erreurs « Cannot Access Class » dans vos projets Java.