【Java】Java异常NoClassDefFoundError 和 ClassNotFoundException 有什么区别?

简介: NoClassDefFoundError 和 ClassNotFoundException 有什么区别

NoClassDefFoundError 和 ClassNotFoundException 有什么区别

类的加载分为显式加载(用字符串为类名加载类,抛出ClassNotFoundException)和隐式加载(不是通过显式方法调用,由引用、实例化或继承导致装入类。通常这种错误在编译阶段会发现,报错为找不到符号。如果编译时能找到这个类,但运行时找不到这个类,就抛出NoClassDefFoundError)
官方文档解释如下:
————————————————
ClassNotFoundException:

  • Thrown when an application tries to load in a class through its
  • string name using:
  • 类 Class 中的 forName() 方法。
  • 类 ClassLoader 中的 findSystemClass() 方法。
  • 类 ClassLoader 中的 loadClass() 方法。
  • but no definition for the class with the specified name could be found.

————————————————
NoClassDefFoundError:

  • Thrown if the Java Virtual Machine or a ClassLoader instance
  • tries to load in the definition of a class (as part of a normal method call
  • or as part of creating a new instance using the new expression)
  • and no definition of the class could be found.
  • The searched-for class definition existed when the currently
  • executing class was compiled, but the definition can no longer be
  • found.

比如:用maven的pom文件里引用了A.jar,这个A.jar需要依赖B.jar,但你只写了A.jar,没写B.jar,就会出现NoClassDefFoundError。 例子:java.lang.NoClassDefFoundError: org/apache/commons/beanutils/PropertyUtils

简单总结下区别:

1、NoClassDefFoundError 是Error 异常 ,然而ClassNotFoundException是检查异常
2、NoClassDefFoundError 是在编译阶段发生,ClassNotFoundException是在运行期,Class.forName()、ClassLoader.findSystemClass()和ClassLoader.loadClass()的时候可能会发生
3、当应用运行时没有找到对应的引用,则会抛出java.lang.NoClassDefFoundError

还有哪些区别:

NoClassDefFoundError是一个错误(Error),而ClassNOtFoundException是一个异常,在Java中对于错误和异常的处理是不同的,我们可以从异常中恢复程序但却不应该尝试从错误中恢复程序。
ClassNotFoundException的产生原因:

Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
ClassNotFoundException的产生原因:

Java支持使用Class.forName方法来动态地加载类,任意一个类的类名如果被作为参数传递给这个方法都将导致该类被加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
ClassNotFoundException的产生原因主要是:
Java支持使用反射方式在运行时动态加载类,例如使用Class.forName方法来动态地加载类时,可以将类名作为参数传递给上述方法从而将指定类加载到JVM内存中,如果这个类在类路径中没有被找到,那么此时就会在运行时抛出ClassNotFoundException异常。
解决该问题需要确保所需的类连同它依赖的包存在于类路径中,常见问题在于类名书写错误。
另外还有一个导致ClassNotFoundException的原因就是:当一个类已经某个类加载器加载到内存中了,此时另一个类加载器又尝试着动态地从同一个包中加载这个类。通过控制动态类加载过程,可以避免上述情况发生。

NoClassDefFoundError产生的原因在于:
如果JVM或者ClassLoader实例尝试加载(可以通过正常的方法调用,也可能是使用new来创建新的对象)类的时候却找不到类的定义。要查找的类在编译的时候是存在的,运行的时候却找不到了。这个时候就会导致NoClassDefFoundError.
造成该问题的原因可能是打包过程漏掉了部分类,或者jar包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

相关文章
|
14天前
|
安全 Java
【JAVA】在 Queue 中 poll()和 remove()有什么区别
【JAVA】在 Queue 中 poll()和 remove()有什么区别
|
18小时前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
9 3
|
1天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
1天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
2天前
|
安全 Java 编译器
Java中String、StringBuilder和StringBuffer的区别
Java中String、StringBuilder和StringBuffer的区别
|
4天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
19 1
探索Java开发中触发空指针异常的场景
|
5天前
|
SQL 网络协议 Java
Java异常详解
Java异常详解
8 1
|
11天前
|
Java
Java中 a+=b和a=a+b有什么区别?
Java中 a+=b和a=a+b有什么区别?
|
11天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
14天前
|
存储 安全 Java
【JAVA】concurrentHashMap和HashTable有什么区别
【JAVA】concurrentHashMap和HashTable有什么区别