【译】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 ...
随机推荐
- OO第一次大作业
前言 前言的前言 这是我的第一篇blog,有点小激动,我还找教程设置了一下我的背景,本来还想弄个页面小宠物,但是看了一下感觉有点复杂,下次一定.如果对我blog的内容有任何修正或者建议可以评论让我知道 ...
- CenOS 安装 mysql 临时密码 处理
数据库 版本 Server version: 8.0.26 MySQL Community Server - GPL:官网下载的包 wget https://cdn.mysql.com//Downlo ...
- python数据处理:获取Dataframe中的一列或一行
解决方案 df['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 df.w #选择表格中的'w'列,使用点属性,返回的是Series类型 df[['w']] #选择表格中的' ...
- django.db.utils.OperationalError: (1366, "Incorrect string value: '\\xE5\\xA4\\xAB\\xE4\\xBA\\xBA' f
1.打开mysql命令行 show variables like '%char%'; 将字符集显示不是utf-8的更改为utf-8 例如:set character_set_database=utf8 ...
- 如何配置Linux的yum源
一.配置本地yum源 1.挂载光盘 a.建目录 #mkdir /media/cdrom b.挂载光盘 #mount /media/sr0 /media/cdrom c.挂载本地iso文件 #mount ...
- python3使用ESL和sipp自动多轮压测FreeSWITCH
环境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 sipp版本:3.6.1 python版本:3.9.12 日常工作中,有时会遇到批量自动压测FreeSWITC ...
- python教程 入门学习笔记 第4天 数据类型 获取数据类型 字符串拼接
数据类型 1.能直接处理的基本数据类型有5个:整型.浮点型.字符串.布尔值.空 1)整型(int)=整数,例如0至9,-1至-9,100,-8180等,人数.年龄.页码.门牌号等 没有小数位的数字,是 ...
- Redhat 8.2 系统语言切换(英文转中文)
前提条件 确保已连上网,并且配好 yum 源 若未配好 yum 源 可参考我上一篇文章 部分 Linux 换国内源 操作步骤 安装中文语言包 dnf install glibc-langpack-zh ...
- Java 日志系列:JUL 使用和原理分析
目录 一. 简介 二.使用 三.日志级别 四.Logger 继承关系 五.配置文件 六.原理解析 一. 简介 JUL 全称 Java util Logging 是 java 原生的日志框架,使用时不需 ...
- 几种常用到的 Hybrid App 技术框架
移动操作系统在经历了诸神混战之后,BlackBerry OS.Symbian OS.Windows Phone 等早期的移动操作系统逐渐因失去竞争力而退出.目前,市场上主要只剩下安卓和 iOS 两大阵 ...
