聊聊面试-NoClassDefFoundError 和 ClassNotFoundException 区别

(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸)


概述

Hello,大家好,我们又来讲面试中的基础题了,今天这是一道很经典又很猥琐的题
说猥琐是因为这两个异常名字比较近似,但事实上他们完全不同,导致很多同学会经常容易把它们搞混

说经典是因为由这道题可以引出的问题有很多,例如:

  1. 考察候选人对 Java 异常体系的熟悉程度
  2. 考察候选人对异常体系分类的了解(Error / Exception)
  3. 深入考察对 Exception 的不同类型的理解
  4. 通过考察面试者如何处理异常,从而考验面试者的编程功底

似乎有太多问题可以探讨,先不展开了,本文主要讲述区别然后会再扩展一下知识点,文章大纲如下:

  1. NoClassDefFoundError 和 ClassNotFoundException 区别的常见回答
  2. 那么 Error 和 Exception 有什么的区别 ?
  3. Exception 的异常类型有哪些?
  4. 使用异常有哪些注意事项?

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) {

}

// 业务代码

以上代码犯了哪几个明显的错误?我简单列举一下:

  1. 捕获异常应该使用特定的类型的 Exception
  2. 没有对异常进行任何处理

为什么要捕获特定类型的异常 ?主要有以下几点
因为你的代码会被团队很多人阅读,宽泛的使用 Exception 对所有异常进行处理会让别人不好理解你代码的异常,程序的主要目的也是要体现它的语义,例如 Thread.sleep 是明确抛出 InterruptedException,Class.forName 明确抛出 ClassNotFoundException,那么应该针对 InterruptedException,ClassNotFoundException 这种明确的异常进行明确的处理,而不是泛泛的使用 Exception 包住所有的异常

没有对异常进行任何处理
这个问题其实比上面更严重,这种行为本质上是在掩盖问题,不仅会导致出现各种诡异的问题,而且完全没有线索可以跟踪,没有人可以猜测到程序是在哪里出了问题,导致定位问题非常低效,所以如果没有抛出异常,最起码也要把对应的的错误信息 到日志内,而不是“生吞”异常,人为的为诊断设置障碍


总结

我们通过一个简单的 NoClassDefFoundError 和 ClassNotFoundException 区别 的问题和一个简单的异常处理程序 demo 牵引出 Java 的异常体系和不同的分类和平时对异常处理的注意事项

另外推荐大家在实践中尽量使用统一异常处理的机制,例如 Spring 提供了几种的全局异常处理机制:

  • 实现 HandlerExceptionResolver 接口
  • 在Controller内部,用 @ExceptionHandler 注解处理异常
  • 全局 Controller 异常处理注解 @ControllerAdvice ,可以根据类型处理特定异常

今天文章写到这里,希望可以帮助大家加深对异常概念的理解,码字不易,觉得不错可以点赞,转发,你的鼓励是我的动力
更多技术咨询,请关注公众号,find me !

(0)

相关推荐

  • 面试官:说说你对Java异常的理解

    回复"000"获取大量电子书 背景 不管是工作中还是面试中,异常这一块还是非常重要的.作为Java开发人员来说,学会如何处理异常,哪些异常必须自己处理,哪些异常可以往外抛等等,这些 ...

  • 异常

    异常 异常指程序运行中出现的不期而至的各种情况 发生在程序运行期间,影响了正常的程序执行流程 需要掌握的三种情况: 检查异常(非运行时异常):编译时可以看到,除了运行时异常,其他都是非运行时异常 不检 ...

  • 由三个感叹号开启的 Debug 篇章?

    如下所示,当我在进行单元测试时,控制台居然抛出了这么诡异的bug! 三个感叹号开头 此刻的我 ??? 异常信息如下: java.lang.ClassNotFoundException: junit.f ...

  • NoClassDefFoundError 和 ClassNotFoundException异常

    NoClassDefFoundError 和 ClassNotFoundException异常

  • 事业单位面试与公务员面试到底有什么区别?

    我的任务很简单,就是做好大家的导者,以最高的效率获得最精准的知识,避免学习路上的弯路和误区,提升面试备考质量. 今天的推文,要跟大家分享的主题是"事业单位面试和公务员面试有什么区别?&quo ...

  • 三言两语,聊聊面试速成和真题质量这回事

    昨晚,有位同学问我一个问题: "领带大叔,这几天把你的面试材料都打印出来了.确实非常好,但是对于我这种速成班的水平来说有些困难,因为你的答案都很具体,很专业,一些专业词汇对于我们平时不练的人 ...

  • 聊聊面试的收获

    要说给我刺激最大的,除了如何和面试官交流就是对"失败经历"的认知了. 当我看到"失败经历"是经典考题时,大脑一片空白,不论怎么摇晃,都是静悄悄地连个声响也没有, ...

  • 聊聊供应链金融与融资租赁区别

    融资租赁与供应链金融的差异 01 主体不同 融资租赁: 融资租赁的业务主要是由融资租赁公司进行开展的.这些公司用自有资金向供应商采购承租方所需要的设备,然后租赁给承租人,赚取采购额与租金收入的差额. ...

  • 湖畔大学改名的原因找到了!顺便聊聊野鸡大学、大学和学院的区别

    湖畔大学介绍 在一开始的时候,我也以为湖畔大学是大学,而且跟西湖大学搞混了,后来才明白过来. 在学界的朋友,一般知道的是西湖大学.西湖大学的校长是施一公,是一所民办大学.当时是2015年,由施一公.潘 ...

  • 青海料是最差的和田玉嘛?大叔聊聊和田玉山料和青海料的区别!

    在"白玉当道"的年代,青海料以其干净的特质在市场中占有相当重要的地位.青海矿区属于新开发矿脉(九十年代末才发现),矿脉一经发现已经来到现代机械工业社会,总体产量比较大,性价比高:同 ...

  • 聊聊汉字的偏旁、部首及字根的区别

    汉字除少数独体字外,剩下的都是合体字,一般由几个部分组成,合体字分几种结构:左右结构,上下结构,半包围结构和全包围结构等. 合体字的组成部分统称偏旁,旧称合体字左边的部分叫"偏", ...

  • $双汇发展(SZ000895)$ 今天我聊聊左侧交易体系和右侧交易体系两者的区别, 右侧交易体系,一...

    右侧交易体系,一般是市场经过很长时间的横盘走势如图所示,在图中左边1的位置开始分批建仓,当2 和3的位置建仓完成后,右侧交易已经不具备继续加仓的理由了,价格走势已经上涨