【译】NoClassDefFoundError和ClassNotFoundException的不同(转)
https://www.jianshu.com/p/93d0db07d2e3
本文翻译自:Difference between NoClassDefFoundError vs ClassNotFoundExcepiton in Java
如果JVM或者ClassLoader在加载类时找不到对应的类,就会引发NoClassDefFoundError和ClassNotFoundException,这两种错误都非常严重。由于不同的ClassLoader会从不同的地方加载类,有时是错误的CLASSPATH引发这类错误,有时是某个库的jar包缺失引发这类错误。NoClassDefFoundError和ClassNotFoundException之间存在一些细微的不同点。
NoClassDefFoundError表示该类在编译阶段还可以找到,但是在运行Java应用的时候找不到了,有时静态块的初始化过程会导致NoClassDefFoundError。
另外一方面,ClassNotFoundException和编译期没什么关系,当你在程序运行时利用反射加载类时((使用Class.forName())时没有找到对应的类),就可能遇到ClassNotFoundException异常,例如加载SQL驱动时,对应的类加载器找不到驱动类。除了这些基本的不同,我们可以看看别的不同,以加深对NoClassDefFoundError和ClassNotFoundException的理解。
NoClassDefFoundError vs ClassNotFoundException
简单来说,NoClassDefFoundError和ClassNotFoundException都是由于在CLASSPATH下找不到对应的类而引起的,通常是缺少对应的jar包,不过,JVM认为:(1)当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError;(2)当你在代码中显式加载类(使用Class.forName())时没有找到对应的类,则会抛出java.lang.ClassNotFoundException。开发者经常遇到的情况是:ClassNotFoundException异常引起了ClassNoDefFoundError。
NoClassDefFoundError是Error,是unchecked,因此也不需要使用try-catch或者finally语句块包围;另外,ClassNotFoundException是受检异常(checked Exception),因此需要使用try-catch语句块或者try-finally语句块包围,否则会导致编译错误。
如果你在J2EE开发中遇到NoClassDefFoundError,那么最有可能的原因就是存在多个类加载器和多个目标类,即我们常说的Jar包冲突——关于Jar包冲突,一般可以使用下面两种方法解决:
- 使用Maven Helper 这个插件,可以排除掉大部分jar包冲突;
- 根据命令
mvn dependency:tree -Dverbose -Dincludes=:logback-classic
调用Class.forName()、ClassLoader.findSystemClass()和ClassLoader.loadClass()等方法时可能会引起java.lang.ClassNotFoundException
NoClassDefFoundError是链接错误,发生在链接阶段,当解析引用的时候找不到对应的类,就会抛出java.lang.NoClassDefFoundError;ClassNotFoundException是异常,发生在运行阶段。
JVM类加载阶段
最后,这里有一页非常好的PPT,总结了这两种异常的不同点:

作者:杜琪
链接:https://www.jianshu.com/p/93d0db07d2e3
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【译】NoClassDefFoundError和ClassNotFoundException的不同(转)的更多相关文章
- 【转】NoClassDefFoundError和ClassNotFoundException
调试Hadoop源码时,一运行就报这个错误,后来发现是maven配置时,scope配置的问题, MAVEN Scope使用 相关链接:http://acooly.iteye.com/blog/178 ...
- 聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别
(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸) ___ 概述 Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是 ...
- JAVA类的静态加载和动态加载以及NoClassDefFoundError和ClassNotFoundException
我们都知道Java初始化一个类的时候可以用new 操作符来初始化, 也可通过Class.forName()的方式来得到一个Class类型的实例,然后通过这个Class类型的实例的newInstance ...
- NoClassDefFoundError vs ClassNotFoundException
我们先来认识一下Error 和Exception, 两个都是Throwable类的直接子类. Javadoc 很好的说明了Error类: An Error is a subclass of Thro ...
- 关于NoClassDefFoundError和ClassNotFoundException异常
java.lang.NoClassDefFoundError 和 java.lang.ClassNotFoundException 都是 Java 语言定义的标准异常.从异常类的名称看似乎都跟类的定义 ...
- NoClassDefFoundError与ClassNotFoundException
原文地址: https://blog.csdn.net/jamesjxin/article/details/46606307 怎么解决NoClassDefFoundError错误 NoClassDef ...
- NoClassDefFoundError与ClassNOtFoundException的区别
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...
- adobe air ane 中有的java class 打包 apk 后却没有了报NoClassDefFoundError ,ClassNotFoundException
apache flex sdk 手机项目 09-18 10:34:55.030: E/AndroidRuntime(19513): FATAL EXCEPTION: main 09-18 10:34: ...
- java.lang.NoClassDefFoundError: Lorg/slf4j/Logger;
如果你出现类似如下错误 1. Install tomcat7 in my home directory and set up `CATALINA_HOME` environment variable ...
- 【转】怎么解决java.lang.NoClassDefFoundError错误 ,以及类的加载机制
转自http://blog.csdn.net/jamesjxin/article/details/46606307 前言 在日常Java开发中,我们经常碰到java.lang.NoClassDefFo ...
随机推荐
- 引入代码来源:深入分析markdown-it-quote插件的魔法
引入代码来源:深入分析markdown-it-quote插件的魔法 markdown-it-quote是一个用于markdown-it的插件,支持多种代码围栏功能. 这是 SourceCodeTrac ...
- Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能.但是通过对 Cilium 不同模式的切换/功能的启用,可以 ...
- React: Warning: `value` prop on `input` should not be null.
警告 解决方案 对value进行判断 修改后的效果 至此问题解决
- Django链接数据库出现的错误以及解决方法
问题一:django.db.utils.OperationalError: (1045, "Access denied for user 'leo'@'localhost' (using p ...
- 王道oj/problem10
地址:http://oj.lgwenda.com/problem/10 思路:首先创建字符串赋初值,其次用gets()输入字符串[fgets()相对于gets()会多识别"\n", ...
- Unity的BuildPlayerProcessor:深入解析与实用案例
Unity BuildPlayerProcessor Unity BuildPlayerProcessor是Unity引擎中的一个非常有用的功能,它可以让开发者在构建项目时自动执行一些操作.这个功能可 ...
- 深入浅出 Typescript
TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程). TypeScript 由微软开发的自由和开源的编程语言. TypeScript 设计 ...
- selenium + python自动化环境搭建
Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firef ...
- 使用 docker 打包构建部署 Vue 项目,一劳永逸解决node-sass安装问题
文章源于 Jenkins 构建 Vue 项目失败,然后就把 node_modules 删了重新构建发现 node-sass 安装不上了,折腾一天终于可以稳定构建了. 犹记得从学 node 的第一天,就 ...
- 【路由器】小米 WR30U 解锁并刷机
本文主要记录个人对小米 WR30U 路由器的解锁和刷机过程,整体步骤与 一般安装流程 类似,但是由于 WR30U 的解锁 ssh 和刷机的过程中有一些细节需要注意,因此记录一下 解锁 ssh 环境准备 ...
