Résolution de l'erreur 'Could Not Find or Load Main Class' en Java

JavaJavaBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Lorsque vous apprenez la programmation Java, vous rencontrerez inévitablement diverses erreurs et exceptions. Une erreur courante que de nombreux débutants rencontrent est l'erreur "Could Not Find or Load Main Class" (Impossible de trouver ou de charger la classe principale). Cette erreur se produit lorsque la Machine Virtuelle Java (Java Virtual Machine - JVM) ne peut pas localiser ou charger la classe contenant la méthode principale qui sert de point d'entrée pour votre application.

Dans ce laboratoire (lab), nous explorerons les causes courantes de cette erreur et apprendrons différentes approches pour la résoudre. En comprenant les raisons sous-jacentes de cette erreur, vous serez mieux équipé pour gérer des problèmes similaires dans vos futurs projets de programmation Java.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) 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{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} java/classes_objects -.-> lab-117401{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} java/packages_api -.-> lab-117401{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} java/files -.-> lab-117401{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} java/io -.-> lab-117401{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} java/working -.-> lab-117401{{"Résolution de l'erreur 'Could Not Find or Load Main Class' en Java"}} end

Créer un programme Java simple

Dans cette étape, nous allons créer un programme Java simple pour comprendre les bases de la compilation et de l'exécution en Java.

  1. Tout d'abord, créons un nouveau fichier Java. Dans le WebIDE, accédez au répertoire du projet (~/project) et créez un nouveau fichier nommé HelloWorld.java.

  2. Ajoutez le code suivant au fichier HelloWorld.java :

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

Comprenons ce que ce code fait :

  • public class HelloWorld : Définit une classe publique nommée HelloWorld
  • public static void main(String[] args) : Définit la méthode principale, qui est le point d'entrée de toute application Java
  • System.out.println("Hello, Java World!") : Affiche le texte "Hello, Java World!" dans la console

La partie la plus importante à noter est que le nom de la classe (HelloWorld) correspond au nom du fichier (HelloWorld.java). Cette convention de nommage est cruciale en Java et ne pas la respecter est l'une des causes courantes de l'erreur "Could Not Find or Load Main Class" (Impossible de trouver ou de charger la classe principale).

  1. Enregistrez le fichier en appuyant sur Ctrl+S ou en sélectionnant Fichier > Enregistrer dans le menu.

Compiler et exécuter votre programme Java

Maintenant que nous avons créé notre programme Java, nous devons le compiler et l'exécuter. La compilation en Java traduit votre code lisible par l'homme (code source) en bytecode que la Machine Virtuelle Java (Java Virtual Machine - JVM) peut comprendre.

  1. Ouvrez un terminal dans le WebIDE (si celui-ci n'est pas déjà ouvert) en cliquant sur Terminal > Nouveau terminal dans le menu.

  2. Assurez-vous que vous êtes dans le bon répertoire :

cd ~/project
  1. Compilez le programme Java en utilisant la commande javac :
javac HelloWorld.java

Si vous ne voyez aucune sortie, cela signifie que la compilation a réussi. Le processus de compilation crée un fichier nommé HelloWorld.class dans le même répertoire. Ce fichier .class contient le bytecode que la JVM peut exécuter.

Vous pouvez vérifier la création de ce fichier en listant le contenu du répertoire :

ls

Vous devriez voir les fichiers HelloWorld.java et HelloWorld.class dans la sortie :

HelloWorld.class  HelloWorld.java
  1. Exécutez le programme compilé en utilisant la commande java :
java HelloWorld

Vous devriez voir la sortie suivante :

Hello, Java World!

Cela indique que votre programme a été compilé et exécuté avec succès.

Comprendre ce flux de travail de base est essentiel avant d'explorer l'erreur "Could Not Find or Load Main Class" (Impossible de trouver ou de charger la classe principale) dans les étapes suivantes.

Comprendre l'erreur "Could Not Find or Load Main Class"

Maintenant que nous comprenons les bases de la compilation et de l'exécution d'un programme Java, explorons l'erreur "Could Not Find or Load Main Class" et ses causes courantes.

Scénario d'erreur 1 : Incompatibilité du nom de classe

L'une des causes les plus courantes de cette erreur est une incompatibilité entre le nom de classe dans votre code et le nom du fichier.

  1. Créez un nouveau fichier nommé NameMismatch.java avec le contenu suivant :
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

Notez que le nom de classe (IncorrectName) ne correspond pas au nom du fichier (NameMismatch.java).

  1. Essayez de compiler ce fichier :
javac NameMismatch.java

La compilation devrait réussir, mais elle créera un fichier nommé IncorrectName.class (correspondant au nom de classe, pas au nom du fichier).

  1. Maintenant, essayez d'exécuter le programme en utilisant le nom du fichier :
java NameMismatch

Vous verrez l'erreur suivante :

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. Pour corriger cette erreur, vous devriez exécuter le programme en utilisant le bon nom de classe :
java IncorrectName

Maintenant, vous devriez voir la sortie suivante :

This program will cause an error!

Scénario d'erreur 2 : Exécution depuis le mauvais répertoire

Une autre cause courante est d'essayer d'exécuter une classe Java depuis un répertoire qui ne contient pas le fichier .class compilé.

  1. Créez un sous-répertoire pour cette démonstration :
mkdir subdirectory
  1. Accédez à ce nouveau répertoire :
cd subdirectory
  1. Essayez d'exécuter le programme HelloWorld depuis ce répertoire :
java HelloWorld

Vous verrez l'erreur suivante :

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. Pour corriger cette erreur, vous pouvez :

    • Revenir au répertoire contenant le fichier .class :
    cd ..
    java HelloWorld
    • Ou spécifier le chemin complet du fichier de classe (que nous explorerons à l'étape 5)

Revenons au répertoire du projet pour les étapes suivantes :

cd ~/project

Travailler avec les packages Java

Les packages en Java sont utilisés pour organiser les classes dans des espaces de noms. Ils aident à gérer les grandes applications en évitant les conflits de noms et en fournissant un contrôle d'accès. Cependant, une utilisation incorrecte des packages peut également entraîner l'erreur "Could Not Find or Load Main Class".

Comprendre la structure des packages

  1. Tout d'abord, créons une structure de répertoires pour notre package. En Java, la structure des packages doit correspondre à la structure des répertoires :
mkdir -p ~/project/com/example
  1. Créez un nouveau fichier Java nommé PackagedClass.java à l'intérieur du répertoire com/example :
cd ~/project/com/example
  1. Ajoutez le code suivant à PackagedClass.java :
package com.example;

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

Notez la déclaration package com.example; en haut du fichier. Cela indique à Java que cette classe appartient au package com.example.

  1. Revenez au répertoire du projet et compilez le fichier :
cd ~/project
javac com/example/PackagedClass.java
  1. Si vous essayez d'exécuter la classe en utilisant seulement le nom de la classe, vous obtiendrez une erreur :
java PackagedClass

Sortie :

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. La bonne façon d'exécuter une classe dans un package est d'utiliser le nom de classe complètement qualifié (y compris le package) :
java com.example.PackagedClass

Maintenant, vous devriez voir la sortie suivante :

This class is in a package!

Points importants sur les packages

  • La déclaration de package doit être la première instruction du fichier.
  • La structure des répertoires doit correspondre à la structure des packages.
  • Lorsque vous exécutez une classe dans un package, vous devez utiliser le nom de classe complètement qualifié.
  • La commande de compilation doit inclure le chemin vers le fichier source, mais la commande d'exécution doit utiliser le nom du package et de la classe, pas le chemin du fichier.

Ce système de packages est fondamental pour le développement Java, en particulier pour les applications plus grandes.

Utilisation du classpath pour résoudre les problèmes de chargement de classes

Le classpath est un paramètre qui indique à la Machine Virtuelle Java (Java Virtual Machine - JVM) où chercher les classes et les packages. Comprendre comment utiliser le classpath est essentiel pour résoudre les erreurs "Could Not Find or Load Main Class", notamment dans les projets plus complexes.

Qu'est-ce que le classpath ?

Le classpath est une liste de répertoires, de fichiers JAR et de fichiers ZIP qui contiennent des fichiers de classes. La JVM utilise cette liste pour rechercher les classes lors du chargement et de l'exécution de votre programme.

Utilisation du paramètre classpath

Créons une nouvelle structure de répertoires pour démontrer l'utilisation du classpath :

  1. Créez un nouveau répertoire pour les classes compilées :
mkdir -p ~/project/classes
  1. Créez un nouveau fichier Java appelé ClasspathDemo.java dans le répertoire du projet :
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. Compilez le fichier Java, en spécifiant que le fichier .class doit être placé dans le répertoire classes :
javac -d classes ClasspathDemo.java

L'option -d spécifie le répertoire de destination pour les fichiers de classes compilés. Vous pouvez vérifier que le fichier de classe a été créé dans le répertoire spécifié :

ls classes

Vous devriez voir :

ClasspathDemo.class
  1. Maintenant, essayez d'exécuter le programme sans spécifier le classpath :
java ClasspathDemo

Vous verrez l'erreur suivante :

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. Pour corriger cette erreur, vous devez spécifier le classpath lors de l'exécution du programme :
java -classpath classes ClasspathDemo

Ou vous pouvez utiliser l'option plus courte -cp :

java -cp classes ClasspathDemo

Maintenant, vous devriez voir la sortie suivante :

Successfully loaded class using classpath!

Configuration de la variable d'environnement CLASSPATH

Au lieu de spécifier le classpath chaque fois que vous exécutez un programme Java, vous pouvez configurer la variable d'environnement CLASSPATH :

export CLASSPATH=~/project/classes:$CLASSPATH

Après avoir configuré cette variable d'environnement, vous pouvez exécuter le programme sans l'option -classpath :

java ClasspathDemo

Et vous devriez voir la même sortie :

Successfully loaded class using classpath!

Quand utiliser le classpath

Vous devrez utiliser le classpath lorsque :

  • Vos classes ne se trouvent pas dans le répertoire actuel
  • Vous utilisez des bibliothèques tierces (fichiers JAR)
  • Vous avez une structure de projet complexe avec plusieurs répertoires de sources
  • Vous travaillez avec des outils de construction comme Maven ou Gradle (qui gèrent le classpath pour vous)

Comprendre le classpath est crucial pour le développement Java au-delà des programmes simples à un seul fichier, et il est souvent la solution à l'erreur "Could Not Find or Load Main Class" dans des configurations plus complexes.

Résumé

Au cours de ce laboratoire, nous avons exploré l'erreur courante "Could Not Find or Load Main Class" en Java et appris plusieurs méthodes pour la résoudre. Voici un résumé de ce que nous avons couvert :

  1. Compilation et exécution de base en Java : Nous avons appris à créer, compiler et exécuter un programme Java simple en utilisant les commandes javac et java.

  2. Causes courantes d'erreur :

    • Décalage entre le nom de classe dans le code et le nom du fichier
    • Exécution depuis le mauvais répertoire
    • Utilisation incorrecte des packages
    • Problèmes de classpath
  3. Travailler avec les packages : Nous avons exploré le fonctionnement des packages en Java, y compris la relation entre la structure des packages et la structure des répertoires, et comment exécuter correctement les classes dans des packages.

  4. Utilisation du classpath : Nous avons appris à utiliser l'option classpath pour indiquer à la JVM où trouver les classes, ce qui est particulièrement utile pour les projets complexes.

L'erreur "Could Not Find or Load Main Class" peut sembler frustrante au départ, mais comprendre ses causes la rend beaucoup plus facile à diagnostiquer et à corriger. Rappelez-vous ces points clés :

  • Le nom de classe dans votre code doit correspondre au nom du fichier (sans l'extension .java)
  • Lorsque vous utilisez des packages, la structure des répertoires doit correspondre à la structure des packages
  • Exécutez toujours les programmes Java depuis le bon répertoire ou utilisez le classpath pour spécifier l'emplacement de vos classes
  • Pour les classes dans des packages, utilisez le nom de classe complètement qualifié (y compris le package) lors de l'exécution du programme

En maîtrisant ces concepts, vous pourrez éviter ou résoudre rapidement cette erreur courante dans votre parcours de développement Java.