24 décembre 2007

Quelle est la différence entre ClassNotFoundException et NoClassDefFoundError

En tant que développeurs Java, nous avons tous rencontré ces deux exceptions. Ceci dit, elles sont souvent confondues, car elles signalent toutes les deux qu'une classe n'a pu être chargée.
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)