ClassNotFoundException и NoClassDefFoundError происходят, когда определенный класс не найден во время выполнения. Однако они встречаются при разных сценариях.
ClassNotFoundException — это исключение, которое возникает, когда вы пытаетесь загрузить класс во время выполнения, используя методы Class.forName () или loadClass (), и упомянутые классы не найдены в пути к классам.
NoClassDefFoundError — это ошибка, которая возникает, когда определенный класс присутствует во время компиляции, но отсутствует во время выполнения.
ClassNotFoundException
ClassNotFoundException — это исключение времени выполнения, которое выдается, когда приложение пытается загрузить класс во время выполнения, используя методы Class.forName () или loadClass () или findSystemClass () , а класс с указанным именем не найден в пути к классам. Например, вы, возможно, сталкивались с этим исключением, когда пытаетесь подключиться к базам данных MySQL или Oracle, и вы не обновили путь к классам необходимыми файлами JAR. В большинстве случаев это исключение возникает при попытке запустить приложение без обновления пути к классу необходимыми файлами JAR.
Например, приведенная ниже программа вызовет исключение ClassNotFoundException, если упомянутый класс «oracle.jdbc.driver.OracleDriver» не найден в пути к классам.
public class MainClass
{
public static void main(String[] args)
{
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
}catch (ClassNotFoundException e)
{
e.printStackTrace();
}
}
}
Если вы запустите вышеупомянутую программу без обновления пути к классу необходимыми JAR-файлами, вы получите исключение, похожее на:
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
NoClassDefFoundError — это ошибка, которая выдается, когда Java Runtime System пытается загрузить определение класса, и это определение класса больше не доступно. Требуемое определение класса присутствовало во время компиляции, но отсутствовало во время выполнения. Например, скомпилируйте программу ниже.
class A
{
// some code
}
public class B
{
public static void main(String[] args)
{
A a = new A();
}
}
Когда вы компилируете вышеуказанную программу, будут сгенерированы два файла .class. Один — A.class, а другой — B.class . Если вы удалите файл A.class и запустите файл B.class , Java Runtime System выдаст NoClassDefFoundError, как показано ниже:
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)
резюмировать
ClassNotFoundException |
NoClassDefFoundError |
Это исключение. Это типа java.lang.Exception. |
Это ошибка. Это имеет тип java.lang.Error. |
Это происходит, когда приложение пытается загрузить класс во время выполнения, который не обновляется в пути к классам. |
Это происходит, когда система времени выполнения Java не находит определение класса, которое присутствует во время компиляции, но отсутствует во время выполнения. |
Он выбрасывается самим приложением. Он генерируется такими методами, как Class.forName (), loadClass () и findSystemClass (). |
Это брошено Системой выполнения Java. |
Это происходит, когда classpath не обновляется необходимыми файлами JAR. |
Это происходит, когда требуемое определение класса отсутствует во время выполнения. |