ClassNotFoundException和NoClassDefFoundError区别

ClassNotFoundException:

  • 它是Exception,不是Error在Throwable体系中只是一个Exception,说明它是可恢复的
  • 发生的时机
    当应用试图通过给定的name加载对应的class时可能抛出此异常,找不到对应的class文件时抛出。常见的场景就是:
    • 调用class的forName方法时,找不到指定的类
    • ClassLoader 中的 findSystemClass() 方法时,找不到指定的类
    • ClassLoader 中的 loadClass() 方法时,找不到指定的类

NoClassDefFoundError

  • Error级别,比Exception要严重
  • JVM或者ClassLoader试图加载一个class的definition的时候,找不到对应的class的definition,通常时new A()的时候

ClassNotFoundException的产生原因: Â
Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。

要解决这个问题很容易,唯一需要做的就是要确保所需的类连同它依赖的包存在于类路径中。当Class.forName被调用的时候,类加载器会查找类路径中的类,如果找到了那么这个类就会被成功加载,如果没找到,那么就会抛出ClassNotFountException,除了Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass在动态加载类到内存中的时候也可能会抛出这个异常。

另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。

NoClassDefFoundError产生的原因:
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个错误往往是你使用new操作符来创建一个新的对象但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError.

由于NoClassDefFoundError是有JVM引起的,所以不应该尝试捕捉这个错误。

解决这个问题的办法就是:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

另:
ClassNotFoundException发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。

NoClassDefFoundError: 当目前执行的类已经编译,但是找不到它的定义时,也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误

加载时从外存储器找不到需要的class就出现ClassNotFoundException
连接时从内存找不到需要的class就出现NoClassDefFoundError

posted @ 2018-10-09 22:09  john8169  阅读(200)  评论(0编辑  收藏  举报