当前位置:网站首页>NoClassDefFoundError 和 ClassNotFoundException 有什么区别
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
2022-06-10 10:48:00 【华为云】
从类继承层次上来看,ClassNotFoundException是从Exception继承的,所以ClassNotFoundException是一个检查异常。NoClassDefFoundError是从Error继承的。和ClassNotFoundException相比,明显的一个区别是,NoClassDefFoundError并不需要应用程序去关心catch的问题。
NoClassDefFoundError
当JVM在加载一个类的时候,如果这个类在编译时是可用的,但是在运行时找不到这个类的定义的时候,JVM就会抛出一个NoClassDefFoundError错误。比如当我们在new一个类的实例的时候,如果在运行时类找不到,则会抛出一个NoClassDefFoundError的错误。通常发生在执行动态代码块或者初始化静态字段时报了异常,从而导致类初始化失败而引发NoClassDefFoundError。案例如下:
public class ClassWithInitErrors { static int data = 1 / 0;}public class NoClassDefFoundErrorTest { public ClassWithInitErrors getClassWithInitErrors() { ClassWithInitErrors test = new ClassWithInitErrors(); return test; } @Test(expected = NoClassDefFoundError.class) public void givenInitErrorInClass_whenloadClass_thenNoClassDefFoundError() { NoClassDefFoundErrorTest sample = new NoClassDefFoundErrorTest(); sample.getClassWithInitErrors(); }}执行程序后会出现如下错误:
java.lang.Exception: Unexpected exception, expected<java.lang.NoClassDefFoundError> but was<java.lang.ExceptionInInitializerError> at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:28) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) ... moreCaused by: java.lang.ArithmeticException: / by zero at com.zjq.dailyrecord.throwable.ClassWithInitErrors.<clinit>(ClassWithInitErrors.java:4) ... 25 moreClassNotFoundException
当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在classpath中查找到指定的类,就会抛出ClassNotFoundException。一般情况下,当我们使用Class.forName()或者ClassLoader.loadClass以及使用ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出ClassNotFoundException。
最简单的,当我们使用JDBC去连接数据库的时候,我们一般会使用Class.forName()的方式去加载JDBC的驱动,如果我们没有将驱动放到应用的classpath下,那么会导致运行时找不到类,所以运行Class.forName()会抛出ClassNotFoundException。案例如下:
public class ClassNotFoundExceptionTest { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }}执行后输出:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:264) at com.zjq.dailyrecord.throwable.ClassNotFoundExceptionTest.main(ClassNotFoundExceptionTest.java:6)总结区别
| ClassNotFoundException | NoClassDefFoundError |
|---|---|
| 从java.lang.Exception继承,是一个Exception类型 | 从java.lang.Error继承,是一个Error类型 |
| 当动态加载Class的时候找不到类会抛出该异常 | 当编译成功以后执行过程中Class找不到导致抛出该错误 |
| 一般在执行Class.forName()、ClassLoader.loadClass()或ClassLoader.findSystemClass()的时候抛出 | 由JVM的运行时系统抛出 |
解决办法
他们的主要原因是运行时类路径中类文件不可用。
下面是几点具体的原因:
- 排查所需的jar包是否在类路径中,如果没有就添加进去。
- 如果发现类在classpath里面,很有可能是classpath被重写了,需要再次确定应用准确的classpath
- 依赖包发生了冲突,比如应该依赖高版本jar包,但又其它包传递依赖了低版本jar包,导致高版本中某些类找不到。
- 如果应用中用到了多个类加载器,一个类加载器加载的类,无法再其他的类加载器中使用。
边栏推荐
- 关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
- It's more convenient to keep warm water. It's a small artifact for daily milk brewing. It's a colorful jingle wireless portable milk mixer
- 杰理之BLE OTA 升级需要关闭不必要的外设【篇】
- Yutai semiconductor rushes to the scientific innovation board: the annual revenue is 830million, and the actual controller is American
- fcpx插件:PremiumVFX Animation Presets(动画循环预设) v1.0.1特别版
- [untitled]
- [high concurrency] about optimistic lock and pessimistic lock, the interviewer of ant financial asked me these questions!!
- Continuous subarray of maximum sum
- AttributeError: module ‘gym.envs.box2d‘ has no attribute ‘LunarLander‘ 解决办法
- 钰泰半导体冲刺科创板:年营收8.3亿 实控人为美国籍
猜你喜欢

单片机触发器或非门工作原理以及用途

二进制、八进制、十进制、十六进制间互转(整数加小数)

Colorui color matching details

基于SSH的音乐检索系统

Vite's public directory

cocoslua在vs2013的调试方法

NeRF:用深度学习完成3D渲染任务的蹿红

Northrop Grumman has passed the registration: the annual revenue is 600million, and Wu Jie, the actual controller, is an American

Debugging method of cocoslua in vs2013

中台:数据中台、业务中台、技术中台、应用中台、AI中台……
随机推荐
Working principle and application of single chip trigger or not gate
[untitled]
Pat class a 1126 Euler path
【高并发】关于乐观锁和悲观锁,蚂蚁金服面试官问了我这几个问题!!
MySQL的体系结构
Golang thread safe local map -- GOCACHE
网上开户渠道靠谱吗?安不安全?
Test question bank and simulation test for operation certificate of ordinary scaffolder (special type of construction work) in 2022
Sublime text - 01 code tracking
It is very convenient to make a data analysis crosstab with one line of code
Vs code supports configuring remote synchronization
How to state clearly and concisely the product requirements?
Can I open an account for online stock trading? Is it safe?
Sublime Text - 01 代码追踪
【通信协议】UART,I2C,SPI复习
香槐路的香槐花,匆匆四年无归期。
常用Shell命令 - 02 压缩和解压缩
Stock to maximize profits
PAT 甲级 1134 顶点覆盖
Question bank and answers of 2022 metal and nonmetal mine hoist operation examination