ClassNotFoundException与NoClassDefFoundError的区别

简介: ClassNotFoundException与NoClassDefFoundError的区别

ClassNotFoundException与NoClassDefFoundError的区别是java面试的常见题目之一,这种题目怎么可以答错呢?

Java开发中常见两种查找不到Class的异常,分别是
java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError,二者主要区别是显式装载的时候找不到类还是隐式装载的时候找不到类。 在Java中,类需要被类加载器加到到JVM内存中才能被使用,类的装载有两种方式

一、显式装载

程序中使用指定的方法加载指定的类,目前有以下三种情况

  • Class.forName()
  • ClassLoader的loadClass方法
  • ClassLoader的findSystemClass()方法(protected final,只能在本类或者继承的子类才可以使用)

当调用以上任何一个方法的时候,指定的类由类装入器装入。如果类已经装入,那么只是返回一个引用;否则,装入器会通过委托模型装入类。

二、隐式装载

隐式  类装入发生在由于引用、实例化(new)或继承导致装入类的时候(不是通过显式方法调用)。在每种情况下,装入都是在幕后启动的,JVM  会解析必要的引用并装入类。与显式类装入一样,如果类已经装入了,那么只是返回一个引用;否则,装入器会通过委托模型装入类。  类的装入通常组合了显式和隐式类装入。例如,类装入器可能先显式地装入一个类,然后再隐式地装入它引用的所有类。

ClassNotFoundException发生在显式装载类的时候查找不到对应的类文件的时候;

NoClassDefFoundError发生在隐式装载类的时候查找不到对应的类文件的时候,此时执行的类已经编译但是在执行的时候找不到定义的类文件,存在searched-for类定义,也就是说引用的类在类路径中没有找到。例如存在一个Maven多模块工程,在其中一个war   Maven模块中通过new或者引用隐式引入了某个类,此时编译总是成功的,然而有另外一个Maven模块是用来将工程打包成ear包部署到WAS中的,此时此模块打包的时候漏掉了在war  Maven模块中引用的类所在的包,此时打包成功,但是执行的时候就会出现 NoClassDefFoundError。

相关文章
|
2月前
|
IDE Java 应用服务中间件
Java“ClassNotFoundException”解决
Java中的“ClassNotFoundException”表示JVM找不到指定的类。解决方法包括:确保类路径正确、检查依赖是否完整、确认类名无误、清理和重新构建项目等。
168 0
|
6月前
|
Java PHP
java.lang.UnsupportedOperationException怎么解决?
在Java中,`Arrays.asList()`方法用于将数组转换为列表,但返回的是一个固定大小的列表,它继承自`AbstractList`,不支持`add()`, `remove()`, 或其他可变操作。当尝试对这样的列表执行这些操作时,会抛出`UnsupportedOperationException`。
|
6月前
|
Java 编译器
Java运行时异常和非运行时异常
Java运行时异常和非运行时异常
|
7月前
|
Java
java.lang.ExceptionInInitializerError异常原因及解决方法总结
java.lang.ExceptionInInitializerError异常原因及解决方法总结
1603 0
|
XML Java 数据库连接
【问题已解决】Caused by: java.lang.IllegalStateException
【问题已解决】Caused by: java.lang.IllegalStateException
186 0
|
Java 数据库
ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
ClassNotFoundException 是个 Exception,是使用类似 Class.forName() 等方法动态加载类时,由于找不到对应的类而发生的 checked exception。
94 0
ClassNotFoundException 和 NoClassDefFoundError 有什么区别?
|
Java 数据库连接 数据库
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
99 0
50. ClassNotFoundException 和 NoClassDefFoundError 有什么区别
|
Java 数据库连接 数据库
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
117 1
|
开发框架 Java 开发者
|
Java Apache Maven
【Java】Java异常NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
NoClassDefFoundError 和 ClassNotFoundException 有什么区别
317 0