ClassNotFoundException与NoClassDefFoundError


当在运行时找不到特定的类时,将发生ClassNotFoundExceptionNoClassDefFoundError。但是,它们发生在不同的情况下。

当您尝试在运行时使用Class.forName()loadClass()方法加载类并且在类路径中找不到所提到的类时,ClassNotFoundException是发生异常。

NoClassDefFoundError是在编译时存在某个特定类但在运行时丢失该类时发生的错误。

ClassNotFoundException

ClassNotFoundException是运行时异常,当应用程序尝试使用Class.forName()loadClass()findSystemClass()方法在运行时加载类时抛出 ,并且在类路径中找不到具有指定名称的类。例如,当您尝试连接到MySQL或Oracle数据库并且尚未使用必需的JAR文件更新类路径时,可能遇到了此异常。在大多数情况下,当您尝试运行应用程序而不用必需的JAR文件更新类路径时,就会发生此异常。

例如,如果在类路径中找不到提到的类“ oracle.jdbc.driver.OracleDriver”,则下面的程序将引发ClassNotFoundException

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运行时系统尝试加载类的定义时抛出的错误,并且该类定义不再可用。所需的类定义在编译时出现,但在运行时丢失。例如,编译下面的程序。

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运行时系统抛出的。
当类路径未使用必需的JAR文件更新时,会发生这种情况。 当运行时缺少所需的类定义时,就会发生这种情况。


原文链接:http://codingdict.com