ClassNotFoundException 和 NoClassDefFoundError

技术/Java/翻译

https://dzone.com/articles/java-classnotfoundexception-vs-noclassdeffounderro

ClassNotFountExceptionNoClassDefFoundError 指的是在运行时找不到一个特定的类。但是他们发生在不同的场景之下。

ClassNotFountException ,当你在运行时试图通过Class.forName()或者loadClass()方法去加载一个类,但是这个类在指定的路径下并不存在,就会产生一个ClassNotFountException 异常。

NoClassDefFoundError,这个错误发生在以下这种情况下,一个特定的类在编译时候存在,但是到了运行时却找不到了。

ClassNotFountException

ClassNotFountException 是一个运行时的异常,它是应用程序在运行时尝试去使用Class.forName()loadClass() 或者 findSystemClass()方法通过一个特定的类名称去加载一个类,但是找不到该类时抛出的异常。举个例子,你在尝试连接MySQL或者Oracle数据库时,但是没有更新相关的JAR包,就会遇到过类似的异常。通常来说,这类异常就发生在你运行一个应用程序,却没有加入所需要的JAR包依赖的时候。

例如,下面的程序代码就会因为oracle.jdbc.driver.OracleDriver这个类找不到而抛出一个ClassNotFountException

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运行时系统会抛出一个如下的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)

直接对比

ClassNotFountException NoClassDefFoundError
异常 错误
应用程序在运行时尝试加载一个没有在类路径中更新的类 运行时系统找不到一个在编译时存在,运行时不存在的类
被应用程序抛出,在调用 Class.forName(), loadClass() 和 findSystemClass() 时会抛出 由运行时系统抛出,跟应用程序无关
通常是因为所需的Jar包没有更新 通常是因为所需的类定义在运行时丢失


本作品由TedXiong采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Copyright © tedxiong.com 2017 all right reserved,powered by Gitbook该文章修改时间: 2018-05-17 15:08:30

results matching ""

    No results matching ""