ClassNotFoundException und NoClassDefFoundError treten auf, wenn eine bestimmte Klasse zur Laufzeit nicht gefunden wird, allerdings in unterschiedlichen Szenarien.
ClassNotFoundException ist eine Ausnahme, die auftritt, wenn Sie versuchen, eine Klasse zur Laufzeit mit den Methoden Class.forName() oder loadClass() zu laden und die genannten Klassen nicht im Klassenpfad gefunden werden.
public class MainClass
{
public static void main(String[] args)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
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.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at pack1.MainClass.main(MainClass.java:17)
NoClassDefFoundError ist ein Fehler, der auftritt, wenn eine bestimmte Klasse zur Kompilierzeit vorhanden ist, aber zur Laufzeit fehlt.
class A
{
// some code
}
public class B
{
public static void main(String[] args)
{
A a = new A();
}
}
Wenn Sie das obige Programm kompilieren, werden zwei .class-Dateien erzeugt. Eine ist A.class und die andere ist B.class. Wenn Sie die Datei A.class entfernen und die Datei B.class ausführen, löst das Java Runtime System den Fehler NoClassDefFoundError aus, wie unten dargestellt:
Exception in thread "main" java.lang.NoClassDefFoundError: A
at MainClass.main(MainClass.java:10)
Caused by: java.lang.ClassNotFoundException: A
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)