ClassNotFoundException 和 NoClassDefFoundError 区别

要区分这两个异常,先要了解类装载的显式和隐式两种方式java

类装入的方式有两种 —— 显式 或 隐式,二者之间有些细微差别。web

显式 类装入发生在使用如下方法调用装入的类的时候:
•cl.loadClass()(cl 是 java.lang.ClassLoader 的实例)
•Class.forName()(启动的类装入器是当前类定义的类装入器)orm

当调用其中一个方法的时候,指定的类(以类名为参数)由类装入器装入。若是类已经装入,那么只是返回一个引用;不然,装入器会经过委托模型装入类。继承

 

隐式 类装入发生在因为引用、实例化或继承致使装入类的时候(不是经过显式方法调用)。在每种状况下,装入都是在幕后启动的,JVM 会解析必要的引用并装入类。与显式类装入同样,若是类已经装入了,那么只是返回一个引用;不然,装入器会经过委托模型装入类。字符串

类的装入一般组合了显式和隐式类装入。例如,类装入器可能先显式地装入一个类,而后再隐式地装入它引用的全部类。虚拟机

 

ClassNotFoundException;it

当应用程序试图经过类的字符串名称,使用如下三种方法装入类,但却找不到指定名称的类定义时抛出该异常,是显式类装载的抛出的异常。
1.类 Class 中的 forName() 方法。
2.类 ClassLoader 中的 findSystemClass() 方法。
3.类 ClassLoader 中的 loadClass() 方法。io

 

NoClassDefFoundError:编译

若是 Java 虚拟机或 ClassLoader 实例试图装入类定义(做为正常的方法调用的一部分,或者做为使用 new 表达式建立新实例的一部分),但却没有找到类定义时抛出该异常。
    当目前执行的类已经编译,可是找不到它的定义时,会存在 searched-for 类定义。
    实际上,这意味着 NoClassDefFoundError 的抛出,是不成功的隐式类装入的结果。
    简单说来,就是引用的类在类路径中没有找到。webkit

相关文章
相关标签/搜索