Premièrement, ClassNotFoundException est une Exception alors que NoClassDefFoundError est de type Error.
D'après la javadoc ClassNotFoundException est renvoyée lorsqu'une application essaye de charger dynamiquement une classe à travers son nom, en utilisant entre autre la méthode Class.forName(), mais la classe n'est pas trouvée dans le CLASSPATH.
Exemple
Soit la classe suivante :
public class A {
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("ClasseQuiNexistePas");
}
}
Son exécution prévoquera l'exception suivante :
Exception in thread "main" java.lang.ClassNotFoundException: ClasseQuiNexistePas
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at A.main(A.java:6)
NoClassDefFoundError est renvoyée lorsque une Classe A ne trouve pas une autre classe B delaquelle elle dépend, alors qu'au moment de la compilation la classe B est présente.
Exemple
Soit les deux classes A et B :
class A {
public static void main(String[] args) {
B b = new B();
}
}
public class B { }
Compilez les deux classes, ensuite supprimer le fichier B.class et lancer la classe A (java A)
Résultat
Exception in thread "main" java.lang.NoClassDefFoundError: B
at test2.A.main(A.java:6)