NoClassDeFoundError与ClassNotFoundException二者的区别

本文深入探讨了Java中的NoClassDeFoundError和ClassNotFoundException,这两个错误分别代表了类加载的不同阶段出现问题。NoClassDeFoundError是在解析阶段,由于类未被找到导致的错误,通常与类路径或类加载机制有关;而ClassNotFoundException则在类加载阶段抛出,通常是因为尝试通过全限定名加载类但找不到对应的.class文件。两者分别属于Error和Exception,前者是不可捕获的,后者可以被捕获并处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:深入理解NoClassDeFoundError与ClassNotFoundException_XiangYida-优快云博客_noclassdefounderror

深入理解NoClassDeFoundError与ClassNotFoundException


1.先看一下两个类
NoClassDeFoundError


ClassNotFoundException


区别在于,一个继承自Exception,另一个继承自Error。
这里就涉及到Exception与Error的区别了。
Exception属于CheckedException错误,就是程序能捕获处理的错误。
而Error属于UnCheckedException,是程序无法捕获处理的错误。

2.NoClassDeFoundError
NoClassDeFoundError继承自LinkageError,根据名字我们就可以猜到这是一个类加载过程中连接时错误。这里涉及到JVM中类加载的过程

类的生命周期图

在Linking的解析阶段:解析阶段是JVM将常量池内的符号引用替换为直接引用的过程
解释一下符号引用与直接引用

符号引用:就是用一组符号来描述所引用的目标,符号引用可以是任何形式的字面量,只要使用时能无歧义的定位到目标即可。

直接引用: 就是直接指向目标的指针

,在类生命周期的解析阶段之前,还只是符号这就是符号引用。 在解析过程中,JVM会去找类是否被加载,如果未加载会先加载类,然后返回类的引用。这就是直接引用

所以,如果在连接阶段的解析时,找不到相应的类,就会报NoClassDeFoundError
 

假设一个类abc extends ABC
在Windows中,文件名不区分大小写
所以,在编译的时候,先编译父类生成ABC.class然后编译子类abc.class,这个时候由于不区分大小写,abc.class直接覆盖掉了ABC.class的内容了


然后在 解析 阶段的时候,就找不到ABC这个类啦~。所以就报 NoClassDeFoundError 咯~~
(Linux上我已经测试过了,编译后文件内容不会覆盖

3.ClassNotFoundException
这个这个错误其实是经常遇到的。比如JDBC的时候忘了添加驱动。
呐~直接举个例子

public static void main(String[] args) throws ClassNotFoundException {
   Class.forName("com.mysql.jdbc.driver");
}

报错信息

Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.driver
···(此处省略)
使用Class.forName();必须要抛出异常或者try/catch。这也是就Excetion与Error的区别。一个是能捕获到的,一个是不能捕获到的错误。
这里的应该是程序运行的时候通过类的全限定名去加载类的时候找不到这个类抛出的异常。

4.最后再总结一下:
NoClassDeFoundError 继承自Error属于用户程序无法捕获处理的异常

ClassNotFoundException 继承自Exception属于用户程序能捕获处理的异常

NoClassDeFoundError 发生在类生命周期中解析阶段找不到相应的类

ClassNotFoundException 发生在类生命周期的加载阶段,找不到相应的类
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值