【译】NoClassDefFoundError和ClassNotFoundException的不同

简介:

本文翻译自:Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java


如果JVM或者ClassLoader在加载类时找不到对应的类,就会引发NoClassDefFoundErrorClassNotFoundException,这两种错误都非常严重。由于不同的ClassLoader会从不同的地方加载类,有时是错误的CLASSPATH引发这类错误,有时是某个库的jar包缺失引发这类错误。NoClassDefFoundErrorClassNotFoundException之间存在一些细微的不同点。

NoClassDefFoundError表示该类在编译阶段还可以找到,但是在运行Java应用的时候找不到了,有时静态块的初始化过程会导致NoClassDefFoundError

另外一方面,ClassNotFoundException和编译期没什么关系,当你在程序运行时利用反射加载类时,就可能遇到ClassNotFoundException异常,例如加载SQL驱动时,对应的类加载器找不到驱动类。除了这些基本的不同,我们可以看看别的不同,以加深对NoClassDefFoundErrorClassNotFoundException的理解。

NoClassDefFoundError vs ClassNotFoundException

简单来说,NoClassDefFoundErrorClassNotFoundException都是由于在CLASSPATH下找不到对应的类而引起的,通常是缺少对应的jar包,不过,JVM认为:(1)当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError;(2)当你在代码中显式加载类(使用Class.forName())时没有找到对应的类,则会抛出java.lang.ClassNotFoundException。开发者经常遇到的情况是:ClassNotFoundException异常引起了ClassNoDefFoundError。

  1. NoClassDefFoundError是Error,是unchecked,因此也不需要使用try-catch或者finally语句块包围;另外,ClassNotFoundException是受检异常(checked Exception),因此需要使用try-catch语句块或者try-finally语句块包围,否则会导致编译错误。

  2. 如果你在J2EE开发中遇到NoClassDefFoundError,那么最有可能的原因就是存在多个类加载器和多个目标类,即我们常说的Jar包冲突——关于Jar包冲突,一般可以使用下面两种方法解决:

    • 使用Maven Helper 这个插件,可以排除掉大部分jar包冲突;
    • 根据命令mvn dependency:tree -Dverbose -Dincludes=:logback-classic
  3. 调用Class.forName()ClassLoader.findSystemClass()ClassLoader.loadClass()等方法时可能会引起java.lang.ClassNotFoundException

  4. NoClassDefFoundError是链接错误,发生在链接阶段,当解析引用的时候找不到对应的类,就会抛出java.lang.NoClassDefFoundErrorClassNotFoundException是异常,发生在运行阶段。


    JVM类加载阶段

最后,这里有一页非常好的PPT,总结了这两种异常的不同点:


nice slide of all differences between java.lang.NoClassDefFoundError and java.lang.ClassNotFoundException in Java


相关文章
|
2月前
|
Java
NoSuchMethodException
NoSuchMethodException
38 3
|
16天前
|
IDE Java 应用服务中间件
Java“ClassNotFoundException”解决
Java中的“ClassNotFoundException”表示JVM找不到指定的类。解决方法包括:确保类路径正确、检查依赖是否完整、确认类名无误、清理和重新构建项目等。
|
Java 数据库
ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
ClassNotFoundException 是个 Exception,是使用类似 Class.forName() 等方法动态加载类时,由于找不到对应的类而发生的 checked exception。
81 0
ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
|
Java
Java 自定义异常(Exception)
Java 自定义异常(Exception)
60 0
|
Java 数据库连接 数据库
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
96 0
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
|
Java 数据库连接 数据库
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
113 1
|
开发框架 Java 开发者
JAVA-异常问题-NoClassDefFoundError和ClassNotFoundException
我们在JAVA开发中-遇到的NoClassDefFoundError和ClassNotFoundException异常问题
|
Java Apache Maven
【Java】Java异常NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
304 0
|
Java 关系型数据库 MySQL
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.log.MLog
Caused by: java.lang.ClassNotFoundException: com.mchange.v2.log.MLog
304 0