Статьи

ClassNotFoundException против NoClassDefFoundError

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.

Это происходит, когда требуемое определение класса отсутствует во время выполнения.