Java 面试中有个很常见的问题:请对比 Exception 和 Error,另外一个,“运行时异常” 与 “一般异常” 有什么区别?
今天在看 「极客时间」的 《Java 核心技术 36 讲》 中又有提到。
大家都熟悉的典型回答:
在杨老师分析这道题时,有提到,关于异常需要掌握的两个方面:
这里提出了一个问题:ClassNotFoundException 和 NoClassDefFoundError 有什么区别。
在这之前,自己没有遇到过这个问题,就借此机会做下思考:
ClassNotFoundException 和 NoClassDefFoundError
首先,正如它们的名字所说明的:
NoClassDefFoundError是一个错误(Error),而 ClassNOtFoundException 是一个异常。
在Java中错误和异常是有区别的:我们可以从异常中恢复程序,但却不应该尝试从错误中恢复程序。
ClassNotFoundException 产生的原因:
Java支持使用 Class.forName 方法来动态地加载类,任意一个类的类名如果被作为参数传,递给这个方法都将导致该类被加载到 JVM 中。如果这个类在类路径中没有被找到,那么此时就会在运行时抛出 ClassNotFoundException 异常。
要解决这个问题,就要确保所需的类连同它依赖的包存在于类路径中。当 Class.forName 被调用的时候,类加载器会查找类路径中的类,如果找到了那么这个类就会被成功加载,如果没找到,那么就会抛出ClassNotFountException。
除了 Class.forName,ClassLoader.loadClass、ClassLOader.findSystemClass 在动态加载类到内存中的时候也可能会抛出这个异常。
另外还有一个导致 ClassNotFoundException 的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。
由于类的动态加载在某种程度上是被开发者所控制的,所以他可以选择 catch 这个异常然后采取相应的补救措施。
NoClassDefFoundError 产生的原因:
当 Java 虚拟机 或 ClassLoader 实例试图在类的定义中加载(作为通常方法调用的一部分,或者是使用 new 来创建新的对象)时,却找不到类的定义(要查找的类在编译的时候是存在的,运行的时候却找不到了),抛出此异常。
即当前执行的类被编译时,所搜索的类定义存在,但无法再找到该定义。
这个错误往往是你使用 new 操作符来创建一个新的对象,但却找不到该对象对应的类。这个时候就会导致NoClassDefFoundError
由于 NoClassDefFoundError 是有 JVM 引起的,所以不应该尝试捕捉这个错误。
解决这个问题的办法就是:查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类
二者的区别
ClassNotFoundException 发生在装入阶段。
当应用程序试图通过类的字符串名称,使用常规的三种方法装入类,但却找不到指定名称的类定义时就抛出该异常。
NoClassDefFoundError 当目前执行的类已经编译,但是找不到它的定义时。也就是说你如果编译了一个类B,在类A中调用,编译完成以后,你又删除掉B,运行A的时候那么就会出现这个错误。
加载时从外存储器找不到需要的 Class 就出现 ClassNotFoundException
连接时从内存找不到需要的 class 就出现 NoClassDefFoundError
写在最后:
异常的出现让我们编写的程序运行起来更加的健壮,同时为程序在调试、运行期间发生的一些意外情况,提供了补救机会; 不要推诿或延迟处理异常,就地解决最好,并且需要实实在在的进行处理,而不是只捕捉,不动作, 如无必要,勿用异常。
关于异常的处理,留一个思考题给大家:
下面的代码反映了异常处理中哪些不当之处?欢迎留言讨论。
1try {
2 // 业务代码
3 // …
4 Thread.sleep(1000L);
5} catch (Exception e) {
6 // Ignore it
7}
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有