Qu'est-ce que Java Lang NoclassdeffoundError?

Qu'est-ce que Java Lang NoclassdeffoundError?
Dans le java.égouter.* Package, il y a une classe nommée, noclassdeffounderror. La description de toute classe est la définition de la classe. NoclassdeffoundError signifie aucune définition de classe trouvée erreur. Ceci est lancé lorsque l'instance de la machine virtuelle Java (JVM) ou d'un chargeur de classe essaie de charger dans la définition d'une classe, mais aucune définition de la classe n'a pu être trouvée.

Cet article illustre ce qu'est NoclassdeffoundError et fournit des résolutions. Il fournit deux scénarios importants pour l'exception à lancer et donne leurs résolutions respectives.

Scénario de ligne de commande

Un exemple de situation où cela peut se produire est la suivante: Supposons que le répertoire DIR1 existe dans l'utilisateur @ hostname: ~ $ répertoire. Dans le répertoire, DIR1, le fichier source Java, TheClass.Java, a la classe Java principale, TheClass. Maintenant, à l'invite de commande, user @ hostname: ~ $, le programmeur compile le fichier source, theclass.Java, avec la commande:

javac dir1 / theclass.Java

La compilation passera avec succès pour avoir un fichier bytecode, theClass.classe, qui serait produite dans le répertoire dir1. Si le programmeur continue alors d'exécuter le fichier, la classe.classe, avec la commande suivante:

java dir1 / theclass

Au terminal, il recevrait le message d'erreur:

Erreur: je n'ai pas pu trouver ou charger la classe principale Dir1.La classe
Causé par: java.égouter.NoclassdeffoundError: theclass (mauvais nom: dir1 / theclass)

Le programmeur peut penser que c'est parce qu'il n'a pas écrit le nom de fichier Bytecode à l'invite de commande. Il pourrait donc essayer d'exécuter le programme avec la commande suivante:

java dir1 / theclass.classe

S'il le faisait, il recevrait le message d'erreur:

Erreur: je n'ai pas pu trouver ou charger la classe principale Dir1.La classe.classe
Causé par: java.égouter.ClassNotFoundException: dir1.La classe.classe

Cet article est sur NoclassdeffoundError, et donc ClassNotFoundException ne serait pas abordé. La commande,

java dir1 / theclass

est censé fonctionner, mais cela n'a pas fonctionné. De l'avis de l'auteur, le vrai problème dans cette situation est avec le langage Java et non celui du programmeur.

NoclassdeffoundError en Java se produit lorsque la machine virtuelle Java n'est pas en mesure de trouver une classe particulière lors de l'exécution. Cela peut également se produire dans un programme en cours d'exécution - voir ci-dessous.

Résolution

Pour résoudre ce problème, accédez au répertoire, DIR1 et exécutez le programme à partir de là, avec les commandes suivantes, au terminal, à partir du répertoire utilisateur:

cd dir1
java theclass

Scénario de classe bytecode manquante

Dans cette section, le répertoire user @ hostname: ~ / dir1 $, sera utilisé exclusivement. Considérez le programme Java suivant:

classe ACLASS

classe publique Mainclass
public static void main (String [] args)
Aclass obj = new aclass ();

Supposons que ce soit dans un fichier et enregistré avec le nom, Mainclass.Java dans le répertoire, user @ hostname: ~ / dir1 $. La commande suivante compilera le fichier:

user @ hostname: ~ / dir1 $ javac mainclass.Java

Le résultat sera deux fichiers, Mainclass.Java et Mainclass.classe, dans le même répertoire, dir1. Main-d'œuvre.Java est le fichier source et Mainclass.La classe est le fichier bytecode. Pour exécuter un programme en Java, c'est le fichier de code d'octet qui est exécuté. La commande suivante au terminal exécutera le programme:

user @ hostname: ~ / dir1 $ java mainclass

Noter que ".classe "n'est pas tapé, bien que ce soit son fichier qui est engagé. Il ne devrait pas y avoir de sortie car il n'y a pas de commande d'impression dans le programme. Il ne devrait y avoir que la nouvelle invite de commande, indiquant que la classe MainClass a réussi à exécuter le programme. C'est ainsi que Java.

Avoir les classes comme deux paires de fichiers

Les deux classes ci-dessus peuvent être enregistrées en deux fichiers source différents, avec les noms, Aclass.Java et Theclass.Java. Une classe.Java aurait le code pour AClass et TheClass.Java aurait le code pour Mainclass, avec son nom de fichier renommé dans la classe.

Lorsque ces deux fichiers se trouvent dans le même répertoire, DIR1, seulement la classe.Java doit être dans la commande de compilation. Il intégrerait le cycle.Java . La commande suivante suffit:

user @ hostname: ~ / dir1 $ javac theclass.Java

Dans le répertoire, DIR1, deux nouveaux fichiers en résulteront: TheClass.classe et aclass.classe . Ce sont des fichiers bytecode. La classe.La classe correspond à la classe.Java et Aclass.La classe correspond à la classe.classe.

Maintenant, pour exécuter le programme, seulement la classe.Le fichier de classe doit être commandé (sans l'extension, «.classe"). Il intégrera le fichier bytecode, Aclass.classe. La commande suivante suffit pour exécuter la classe:

user @ hostname: ~ / dir1 $ java theclass

Comme avant, il n'y a pas de sortie. La nouvelle invite de commande devrait apparaître, montrant que le programme a été exécuté avec succès.

NoclassdeffoundError en Java se produit lorsque la machine virtuelle Java n'est pas en mesure de trouver une classe particulière lors de l'exécution. Cela peut également se produire dans un programme en cours d'exécution, car il est illustré dans cette section.

Maintenant, Aclass.La classe fait partie intégrante de la classe.classe. En d'autres termes, la fermeture.La classe ne peut pas fonctionner sans aclass.classe. Donc, si.La classe est supprimée ou renommée, NoclassdeffoundError serait lancé. L'affichage d'erreur du terminal, pour la commande ci-dessus, serait:

Exception dans le fil "Main" Java.égouter.NoclassdeffoundError: Aclass
à la classe.Main (Theclass.Java: 9)
Causé par: java.égouter.ClassNotFoundException: Aclass
à Java.base / jdk.interne.chargeur.Intégrée.LoadClass (intégrée.Java: 581)
à Java.base / jdk.interne.chargeur.Classloaders $ AppClassloadher.LoadClass (Classloaders.Java: 178)
à Java.base / java.égouter.Chargeur de classe.LoadClass (Classloader.Java: 522)
… 1 de plus

Résolution

Ce problème peut être résolu comme suit: Si le Tableau.La classe a été transférée loin de son répertoire, il devrait être ramené. S'il était supprimé, en supposant que.Java et Aclass.Java n'a pas été supprimé, alors le programme doit simplement être recompilé, avec

user @ hostname: ~ / dir1 $ javac theclass.Java

Et un nouvel aclass.classe du répertoire, dir1, serait créé. Et la commande,

user @ hostname: ~ / dir1 $ java theclass

ne publierait pas le message d'erreur long ci-dessus pour noclassdeffounderror.

Possibilité de récupérer

NoclassdeffoundError est une erreur d'exécution, il n'est donc pas vraiment au programmeur de s'en remettre. Comme expliqué ci-dessus, la meilleure façon de gérer le problème est par résolution.

Conclusion

Dans le java.égouter.* Package, il y a une classe nommée, noclassdeffounderror. La description de toute classe est la définition de la classe. NoclassdeffoundError signifie aucune définition de classe trouvée erreur. Ceci est lancé lorsque l'instance de la machine virtuelle Java (JVM) ou d'un chargeur de classe essaie de charger dans la définition d'une classe, mais aucune définition de la classe n'a pu être trouvée.

NoclassdeffoundError est une erreur d'exécution, il n'est donc pas vraiment au programmeur de s'en remettre. La meilleure façon de gérer le problème est par résolution: utilisez la commande de ligne de commande pour exécuter la commande dans le répertoire d'intérêt. Remplacer tout .fichier de classe; ce n'est pas là que c'était censé être.