(上图是圣卡塔利娜岛,美国南加州的一个小岛,也是 mac OS 10.15 版本的官方默认壁纸)java
Hello,你们好,咱们又来说面试中的基础题了,今天这是一道很经典又很猥琐的题 说猥琐是由于这两个异常名字比较近似,但事实上他们彻底不一样,致使不少同窗会常常容易把它们搞混程序员
说经典是由于由这道题能够引出的问题有不少,例如:面试
彷佛有太多问题能够探讨,先不展开了,本文主要讲述区别而后会再扩展一下知识点,文章大纲以下:编程
NoClassDefFoundError 是一种 Error,Error 在大多数状况下表明没法从程序中恢复的致命错误,产生的缘由在于 JVM 或者 ClassLoader 在运行时类加载器在 classpath 下找不到须要的类定义(编译期是能够正常找到的,因此和 ClassNotFoundException 不一样的是这是一个运行期的 Error),这个时候虚拟机就会抛出 NoClassDefFoundError,一般形成该 ERROR 的缘由是打包过程当中漏掉了部分类,或者 jar 包出现损坏或篡改,对应的 Class 在 classpath 中不可用等等缘由微信
ClassNotFoundException 是属于 Exception 的运行时异常,大可能是能够从代码中恢复的异常类型,致使该异常的缘由大可能是由于使用 Class.forName() 方法动态的加载类信息,可是这个类在类路径中并无被找到,那么就会在运行时抛出 ClassNotFoundExceptionapp
以上是大体的 NoClassDefFoundError 和 ClassNotFoundException 的区别,那么延伸一下能够探讨 Java 类型体系中的 Error 和 Exception编码
Error 和 Exception 都是继承 Throwable 类,它们体现 Java 设计者在对异常的不一样状况所进行的分类处理,在 Java 中只有 Throwable 类的实例才能被 try/catch 捕获或者声明抛出。spa
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 对全部异常进行处理会让别人很差理解你代码的异常,程序的主要目的也是要体现它的语义,例如 Thread.sleep 是明确抛出 InterruptedException,Class.forName 明确抛出 ClassNotFoundException,那么应该针对 InterruptedException,ClassNotFoundException 这种明确的异常进行明确的处理,而不是泛泛的使用 Exception 包住全部的异常
没有对异常进行任何处理 这个问题其实比上面更严重,这种行为本质上是在掩盖问题,不只会致使出现各类诡异的问题,并且彻底没有线索能够跟踪,没有人能够猜想到程序是在哪里出了问题,致使定位问题很是低效,因此若是没有抛出异常,最起码也要把对应的的错误信息 到日志内,而不是“生吞”异常,人为的为诊断设置障碍
咱们经过一个简单的 NoClassDefFoundError 和 ClassNotFoundException 区别 的问题和一个简单的异常处理程序 demo 牵引出 Java 的异常体系和不一样的分类和平时对异常处理的注意事项
另外推荐你们在实践中尽可能使用统一异常处理的机制,例如 Spring 提供了几种的全局异常处理机制:
今天文章写到这里,但愿能够帮助你们加深对异常概念的理解,码字不易,以为不错能够点赞,转发,你的鼓励是个人动力 更多技术咨询,请关注公众号,find me !