NoClassDefFoundError和ClassNotFoundException之间的原因和区别是什么?

NoClassDefFoundErrorClassNotFoundException之间有什么区别

是什么原因导致它们被抛出?如何解决这些问题

在修改现有代码以包含新的jar文件时,我经常会遇到这些问题。
对于通过webstart分发的java应用程序,我在客户端和服务器端都找到了它们

我遇到的可能原因:

  1. 代码客户端的build.xml中未包含的包
  2. 我们正在使用的新JAR缺少运行时类路径
  3. 版本与以前的jar冲突

当我今天遇到这些问题时,我会采取循序渐进的方法来解决问题。我需要更多的清晰和理解

与JavaAPI规范的区别如下

对于ClassNotFoundException

当应用程序试图
通过类的字符串加载类
名称使用:

  • class中的forName方法
  • ClassLoader中的findSystemClass方法
  • ClassLoader中的loadClass方法

但对于具有
无法找到指定的名称

对于NoClassDefFoundError

如果Java虚拟机或
ClassLoader实例试图加载
在类的定义中(作为一部分)
属于普通方法调用或作为
使用新实例创建新实例
表达式),并且没有对
可以找到类

已搜索类定义
当前正在执行时存在
类已编译,但定义
再也找不到了

因此,NoClassDefFoundError似乎是在成功编译源代码时发生的,但在运行时,找不到所需的class文件。这可能发生在JAR文件的分发或生产过程中,其中没有包括所有必需的class文件

至于ClassNotFoundException,它可能源于试图在运行时对类进行反射调用,但程序试图调用的类不存在

两者之间的区别在于一个是错误,另一个是异常。WithNoClassDefFoundError是一个错误,它源于Java虚拟机在查找预期要查找的类时遇到问题。由于找不到文件,或者与编译时生成或遇到的文件不同,因此预期在编译时工作的程序无法运行。这是一个非常严重的错误,因为JVM无法启动程序

另一方面,ClassNotFoundException是一个异常,因此它在某种程度上是预期的,并且是可恢复的。使用反射很容易出错(因为有些人认为事情可能不会按预期进行。没有编译时检查来查看所有必需的类是否存在,因此在运行时会出现查找所需类的任何问题

发表评论