前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【译】NoClassDefFoundError和ClassNotFoundException的不同

【译】NoClassDefFoundError和ClassNotFoundException的不同

作者头像
阿杜
发布2018-08-06 11:48:25
1.2K0
发布2018-08-06 11:48:25
举报
文章被收录于专栏:阿杜的世界阿杜的世界

本文翻译自: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
  1. 调用Class.forName()ClassLoader.findSystemClass()ClassLoader.loadClass()等方法时可能会引起java.lang.ClassNotFoundException
  2. NoClassDefFoundError是链接错误,发生在链接阶段,当解析引用的时候找不到对应的类,就会抛出java.lang.NoClassDefFoundErrorClassNotFoundException是异常,发生在运行阶段。

JVM类加载阶段

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.03.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • NoClassDefFoundError vs ClassNotFoundException
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档