Un NoClassDefFoundError (NCDFE) se produit lorsque votre code s'exécute "nouveau" (Y)" et il ne peut pas trouver la classe y.
Il peut être tout simplement que Y est absent de votre chargeur de classe comme les autres commentaires le suggèrent, mais il se pourrait que la classe Y n'est pas signé ou une signature non valide, ou que Y est chargé par un chargeur de classe n'est pas visible de votre code, ou même que Y dépend de Z qui ne pouvaient pas être chargés pour l'une des raisons ci-dessus.
Si cela se produit, la JVM va mémoriser le résultat de chargement X (NCDFE) et il va tout simplement jeter un nouveau NCDFE chaque fois que vous demandez pour Y sans vous dire pourquoi:
class a {
statique de la classe b {}
public static void main(String args[]) {
Système..println("Première tentative new b():");
try {new b(); } catch(Throwable t) {t.printStackTrace();}
Système..println("\ndeuxième tentative new b():");
try {new b(); } catch(Throwable t) {t.printStackTrace();}
}
}
l'enregistrer comme a.java quelque part
Il suffit que le code tente d'instancier une nouvelle classe "b" à deux reprises, d'autres que cela, il n'a pas de bugs, et il ne faut pas faire n'importe quoi.
Compiler le code avec javac a.java
, Puis exécutez un en invoquant java -cp . a
-- il faut juste imprimer deux lignes de texte, et il doit s'exécuter correctement et sans erreurs.
Ensuite, supprimer le "$b.class" fichier (ou le remplir avec des ordures, ou de les copier a.class sur celui-ci) pour simuler manquant ou endommagé de classe. Voici ce qui arrive:
Première tentative new b():
java.lang.NoClassDefFoundError:$b
à un.principal(un.java:5)
Causés par: java.lang.ClassNotFoundException:$b
à java.net.URLClassLoader$1.exécuter(URLClassLoader.java:200)
à java.de sécurité.AccessController.doPrivileged(Native method)
à java.net.URLClassLoader.findClass(URLClassLoader.java:188)
à java.lang.Chargeur de classe.loadClass(ClassLoader.java:307)
au coucher du soleil.misc.Lanceur$AppClassLoader.loadClass(Lanceur.java:301)
à java.lang.Chargeur de classe.loadClass(ClassLoader.java:252)
à java.lang.Chargeur de classe.loadClassInternal(ClassLoader.java:320)
... 1 de plus
Deuxième tentative new b():
java.lang.NoClassDefFoundError:$b
à un.principal(un.java:7)
La première invocation résultats dans une ClassNotFoundException (jeté par le chargeur de classe quand il ne peut pas trouver la classe), qui doit être enveloppé dans un décoché NoClassDefFoundError, depuis que le code en question (new b()
) devrait fonctionner.
La seconde tentative sera bien sûr aussi échouer, mais comme vous pouvez le voir la enveloppé exception, pas plus, parce que le chargeur de classe semble se rappeler échec de la classe chargeurs. Vous ne voyez que le NCDFE avec absolument aucune idée de ce qui s'est réellement passé.
Donc, si jamais vous voyez un NCDFE sans cause, vous devez voir si vous pouvez remonter à la première fois, la classe a été chargé de trouver la cause de l'erreur.