千家信息网

NoClassDefFoundError 和 ClassNotFoundException 的区别是什么

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,今天就跟大家聊聊有关NoClassDefFoundError 和 ClassNotFoundException 的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大
千家信息网最后更新 2024年12月04日NoClassDefFoundError 和 ClassNotFoundException 的区别是什么

今天就跟大家聊聊有关NoClassDefFoundError 和 ClassNotFoundException 的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

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 ,可以根据类型处理特定异常

看完上述内容,你们对NoClassDefFoundError 和 ClassNotFoundException 的区别是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

处理 程序 代码 问题 错误 编译 类型 原因 情况 检查 运行 不同 体系 内容 常见 分类 业务 事项 代表 全局 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器 中转 功能都用数据库进行实现可以吗 零基础如何自学网络技术 岳阳软件开发培训多少钱 wifi不安全连接到服务器 鬼泣手游版服务器选择 数据访问控制数据库设计 计算机网络技术自学看什么书 日常的网络安全 怎么保障核心数据库 江苏省信息网络安全协会尤文杰 逃离塔科夫南非服务器叫什么名字 数据库结构在哪里看 数据库连接文件怎么操作 专利中的计算机与网络技术 恒团惠互联网科技有限公司 如何修改2008数据库端口 陕西美客美互联网科技有限公司 Internet部署网络服务器 天津宏顺源网络技术中心 万明月 腾讯 软件开发 兰德纵横网络技术股份有限公 网络安全组织机构建设 网络安全风险什么意思 四川省金融系统网络安全比赛 福建量化积分管理软件开发系统 修改平台数据库 机关基础设施网络安全 目前有哪些线上商用数据库 2k21进去之后提示无法连接服务器
0