聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别

(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸)
概述
Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题
说猥琐是因为这两个异常名字比较近似,但事实上他们完全不同,导致很多同学会经常容易把它们搞混
说经典是因为由这道题可以引出的问题有很多,例如:
- 考察候选人对 Java 异常体系的熟悉程度
- 考察候选人对异常体系分类的了解(Error / Exception)
- 深入考察对 Exception 的不同类型的理解
- 通过考察面试者如何处理异常,从而考验面试者的编程功底
似乎有太多问题可以探讨,先不展开了,本文主要讲述区别然后会再扩展一下知识点,文章大纲如下:
- NoClassDefFoundError 和 ClassNotFoundException 区别的常见回答
- 那么 Error 和 Exception 有什么的区别 ?
- Exception 的异常类型有哪些?
- 使用异常有哪些注意事项?
NoClassDefFoundError 和 ClassNotFoundException 区别的常见回答
NoClassDefFoundError 是一种 Error,Error 在大多数情况下代表无法从程序中恢复的致命错误,产生的原因在于 JVM 或者 ClassLoader 在运行时类加载器在 classpath 下找不到需要的类定义(编译期是可以正常找到的,所以和 ClassNotFoundException 不同的是这是一个运行期的 Error),这个时候虚拟机就会抛出 NoClassDefFoundError,通常造成该 ERROR 的原因是打包过程中漏掉了部分类,或者 jar 包出现损坏或篡改,对应的 Class 在 classpath 中不可用等等原因
ClassNotFoundException 是属于 Exception 的运行时异常,大多是可以从代码中恢复的异常类型,导致该异常的原因大多是因为使用 Class.forName() 方法动态的加载类信息,但是这个类在类路径中并没有被找到,那么就会在运行时抛出 ClassNotFoundException
以上是大致的 NoClassDefFoundError 和 ClassNotFoundException 的区别,那么延伸一下可以探讨 Java 类型体系中的 Error 和 Exception
Error 和 Exception 的区别
Error 和 Exception 都是继承 Throwable 类,它们体现 Java 设计者在对异常的不同情况所进行的分类处理,在 Java 中只有 Throwable 类的实例才能被 try/catch 捕获或者声明抛出。
Error 在大多数情况下代表程序出现了致命并且不可恢复的错误,它们大多都是不可预测的错误,不需要也不能捕获和抛出,例如常见的 OutOfMemeryError,StackOverFlowError,还有本文提到的 NoClassDefFoundError,他们都是 Error 的子类
Exception 属于程序错误,大多是人为编码所导致的,它们大多都可以预测,也可以通过程序处理让程序正常流程,所以是需要进行捕获(try/catch)或者声明抛出(throw)的,Exception 还分两种情况,可检查异常 checked exception(编译期异常),非检查异常 unchecked exception(运行期异常)
可检查异常是编译期必须要显示处理的异常,编译器会强制要求处理这种的异常,不然编译就不会通过,非检查异常是程序在运行时出现的异常,大多是程序员处理不到导致的程序问题,例如常见的 NullPointerException,ArrayIndexOutOfBoundsException,本文标题的 ClassNotFoundException 就是属于编译期异常,在使用 Class.forName 需要强制处理
一图胜千言,为了方便大家直观感受,我大概画了一个简单的异常体系结构图,仅供参考:

使用异常的注意事项
平时在操作异常的时候有什么需要注意的吗?我们先看一段简单的代码示例
try {
// 业务代码
// something happened
Thread.sleep(100);
} catch (Exception e) {
}
// 业务代码
以上代码犯了哪几个明显的错误?我简单列举一下:
- 捕获异常应该使用特定的类型的 Exception
- 没有对异常进行任何处理
为什么要捕获特定类型的异常 ?主要有以下几点
因为你的代码会被团队很多人阅读,宽泛的使用 Exception 对所有异常进行处理会让别人不好理解你代码的异常,程序的主要目的也是要体现它的语义,例如 Thread.sleep 是明确抛出 InterruptedException,Class.forName 明确抛出 ClassNotFoundException,那么应该针对 InterruptedException,ClassNotFoundException 这种明确的异常进行明确的处理,而不是泛泛的使用 Exception 包住所有的异常
没有对异常进行任何处理
这个问题其实比上面更严重,这种行为本质上是在掩盖问题,不仅会导致出现各种诡异的问题,而且完全没有线索可以跟踪,没有人可以猜测到程序是在哪里出了问题,导致定位问题非常低效,所以如果没有抛出异常,最起码也要把对应的的错误信息 到日志内,而不是“生吞”异常,人为的为诊断设置障碍
总结
我们通过一个简单的 NoClassDefFoundError 和 ClassNotFoundException 区别 的问题和一个简单的异常处理程序 demo 牵引出 Java 的异常体系和不同的分类和平时对异常处理的注意事项
另外推荐大家在实践中尽量使用统一异常处理的机制,例如 Spring 提供了几种的全局异常处理机制:
- 实现 HandlerExceptionResolver 接口
- 在Controller内部,用 @ExceptionHandler 注解处理异常
- 全局 Controller 异常处理注解 @ControllerAdvice ,可以根据类型处理特定异常
今天文章写到这里,希望可以帮助大家加深对异常概念的理解,码字不易,觉得不错可以点赞,转发,你的鼓励是我的动力
更多技术咨询,请关注公众号,find me !

聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别的更多相关文章
- 【转】NoClassDefFoundError和ClassNotFoundException
调试Hadoop源码时,一运行就报这个错误,后来发现是maven配置时,scope配置的问题, MAVEN Scope使用 相关链接:http://acooly.iteye.com/blog/178 ...
- 聊聊面试-int和Integer的区别
最近面试了很多候选人,发现很多人都不太重视基础,甚至连工作十几年,项目经验十几页的老程序员,框架学了一大堆,但是很多 Java 相关的基础知识却很多都答不上来.还有很多人会回答,只知道要用,但是从来不 ...
- NoClassDefFoundError与ClassNOtFoundException的区别
NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该 ...
- 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 ...
- 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: ...
- 全栈工程师对Python面试中is和==区别的详细解说!看完真的学到了!
面试实习生的时候,当问到 is 和 == 的区别时,很多同学都答不上来,搞不清两者什么时候返回一致,什么时候返回不一致.本文我们来看一下这两者的区别. 我们先来看几个例子: a = "hel ...
随机推荐
- Docker下实战zabbix三部曲之二:监控其他机器
在上一章<Docker下实战zabbix三部曲之一:极速体验>中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机器的监控信息,但是在实际场景 ...
- 使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径
报错如图所示: java.io.FileNotFoundException: E:\SF\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtp ...
- 阿里云ECS服务器提示需要修复的漏洞问题
1.漏洞: RHSA-2018:1842: kernel security, bug fix, and enhancement updateRHSA-2018:2299: NetworkManager ...
- 初识Hiberante框架和第一个案例
今天想回顾一下一个月前学的hibernate框架,也让我了解了持久层的概念(访问数据库). 一.ORM概念 首先提的是ORM概念,O表示Object, R表示Relation(关系),关系型数据库,如 ...
- jQuery常用方法(一)-基础
$("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test.jpg", ...
- jquery 全选,反选
<?php foreach ($contents as $item) { ?> <tr> <td><input name="qx" val ...
- HTML5 原生拖放
前言: HTML5提供专门的拖拽与拖放的API,可以方便的指定某个元素可拖动,可以创建自定义的可拖动元素和放置目标 相关知识点: 1.拖放事件 拖放元素时,将依次触发下列事件 dragstart 按 ...
- 【maven的使用】2使用maven与pom文件
一.使用maven:首先需要知道的是,在我们开发人员中有一句话叫做:约定优于配置.比如,如果我们写代码有多种可选方案:硬编码形式:obj.setPath("d:/xxxx") .配 ...
- Chrome 浏览器默认样式覆盖自己 CSS 样式的解决
检查 HTML 源代码,DOCTYPE 的声明是否写正确. HTML5 的 DOCTYPE 声明规范: <!DOCTYPE html> 参考链接: css - User agent sty ...
- selenium + python + firefox 测试环境的搭建与配置
对于做UI自动化,如果是纯编写一段自动化测试程序,那么后续的维护成本会较高.这种情况下,借助 selenium 这款自动化系测试工具,辅助于自己编写部分脚本,将是个不错的选择.selenium 本身支 ...