专栏首页阿杜的世界【译】NoClassDefFoundError和ClassNotFoundException的不同

【译】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
  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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring实战6-利用Spring和JDBC访问数据库主要内容

    写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRepository和SpittleRepository接口...

    阿杜
  • 024:用Java实现shell命令cat 1.log | grep a | sort | uniq -c | sort -rn的功能

    artificial-intelligence-codes-coding-247791.jpg

    阿杜
  • 类加载器中的双亲委派模型详解

    在上一篇文章中,我们梳理了类加载器的基本概念:类的生命周期、类加载器的作用、类的加载和卸载的时机等等,这篇文章我们接着前文继续复习类加载器的知识,主要包括:JV...

    阿杜
  • SAP C4C OData服务的filter,客户端分页和排序的使用方式

    假设系统里已经有许多的Lead历史数据,而我们正在进行的微信小程序和C4C集成的项目里,又创建了许多新的Lead数据。如何将这些新的在微信小程序里调用OData...

    Jerry Wang
  • Android | 纪ANDROID_SDK_ROOT(关于AVD)、关于build.gradle、关于hardware acceleration等三个Bug(文末附上gradle各个版本的下载地址)

    其次,点击File->Project Structure,确定下图红框处的SDK目录有设置:

    凌川江雪
  • 技术分享连载|UGUI对于emoji表情的处理|加载资源时的内存波动|Animator采样……

    我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。 内存管理 Q:...

    企鹅号小编
  • 漏洞分析|Weblogic未授权访问及命令执行分析复现(CVE-2020-14882/14883)

    一、背景 漏洞概述: WebLogic是美国Oracle公司的主要产品之一,是商业市场上主要的 J2EE 应用服务器软件,也是世界上第一个成功商业化的J2EE...

    云鼎实验室
  • JDK源码分析-HashMap(2)

    前文「JDK源码分析-HashMap(1)」分析了 HashMap 的内部结构和主要方法的实现原理。但是,面试中通常还会问到很多其他的问题,本文简要分析下常见的...

    WriteOnRead
  • Centos7.4+Mongodb安装教程

    拓荒者
  • Android Studio导入github项目详解

    版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/48...

    Hankkin

扫码关注云+社区

领取腾讯云代金券