【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包出现损坏或者篡改。解决这个问题的办法是查找那些在开发期间存在于类路径下但在运行期间却不在类路径下的类。

相关文章
|
4天前
|
存储 Java 程序员
Java面试题:请解释Java中的永久代(PermGen)和元空间(Metaspace)的区别
Java面试题:请解释Java中的永久代(PermGen)和元空间(Metaspace)的区别
32 11
|
4天前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
16 3
|
3天前
|
Java
Java进阶之异常捕捉处理和错误处理
【7月更文挑战第9天】Java异常处理确保程序在遇到错误时不会崩溃。关键机制包括try-catch-finally,用于捕获(try)、处理(catch)和清理(finally)异常。异常分为检查型(需编译时处理,如IOException)和非检查型(如NullPointerException)。throw用于抛出异常,throws用于声明方法可能抛出的异常。Error表示系统级错误,不可恢复;Exception是可处理的异常,包括检查型和非检查型。自定义异常通过继承Exception实现。Java 7引入try-with-resources自动关闭资源。
7 1
|
3天前
|
Java 编译器
Java运行时异常和非运行时异常
Java运行时异常和非运行时异常
|
3天前
|
存储 算法 Java
JAVA内存模型与JVM内存模型的区别
JAVA内存模型与JVM内存模型的区别
|
3天前
|
Java
Java进阶之异常捕捉处理和错误处理
Java进阶之异常捕捉处理和错误处理
5 0
|
4天前
|
存储 运维 前端开发
Java面试题:什么是Java的异常处理机制?列举常见的异常类,并说明使用场景
Java面试题:什么是Java的异常处理机制?列举常见的异常类,并说明使用场景
15 0
|
4天前
|
Java 编译器 程序员
Java面试题:解释Java中的异常处理机制,包括checked异常和unchecked异常的区别。
Java面试题:解释Java中的异常处理机制,包括checked异常和unchecked异常的区别。
10 0
|
5天前
|
监控 网络协议 Java
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
Java面试题:解释Java NIO与BIO的区别,以及NIO的优势和应用场景。如何在高并发应用中实现NIO?
11 0
|
4天前
|
Java 调度
Java线程的六种状态
Java线程有六种状态: 初始(NEW)、运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、超时等待(TIMED_WAITING)、终止(TERMINATED)。
13 1