Java中ClassNotFoundException 和 NoClassDefFoundError的区别
ClassNotFoundException和NoClassDefFoundError这两个异常都是在运行时没有找到类时发生的。它们与Java类路径相关。
ClassNotFoundException
当您试图在运行时使用class .forName()或loadClass()方法加载一个类,而所请求的类在类路径中找不到时,会发生ClassNotFoundException。大多数情况下,当您试图运行应用程序而没有使用JAR文件更新类路径时,会发生此异常。此异常是派生自java.lang.Exception类的checked exception,您需要为其提供显式处理。当您有两个类加载器,并且一个ClassLoader试图访问Java中由另一个类加载器加载的类时,也会发生此异常。您一定想知道Java中的类加载器到底是什么。Java ClassLoader是Java运行时环境的一部分,它动态加载JVM(Java虚拟机)中的Java类。Java运行时系统不需要了解文件和文件系统,因为有类加载器。
示例:
输出:
ClassNotFoundException会在上述程序中引发,因为类“GeeksForGeeks”在类路径中找不到。
NoClassDefFoundError
现在讨论下一个异常NoClassDefFoundError,它发生在类在编译时存在,程序编译和链接成功,但类在运行时不存在的情况下。这是一个派生自LinkageError的错误。当一个类对另一个类有一些依赖关系,并且编译前一个类之后后一个类发生了更改时,就会发生链接错误。NoClassFoundError是类隐式加载的结果,因为调用了该类中的方法或访问了该类中的变量。此错误更难以调试和查找发生此错误的原因。在这种情况下,你应该检查依赖于这个类的类。为了说明这一点,让我们首先为一个java程序创建两个类并将它们链接起来。
示例:
输出
输出的解释:
以上程序将成功编译并生成两个类 “GeeksForGeeks.class” and “GFG.class。” 现在删除GeeksForGeeks.class文件,当我们看到在Java运行时将抛出NoClassDefFoundError时,运行gfg.class。
ClassNotFoundException Vs NoClassDefFoundError
- 顾名思义,ClassNotFoundException是异常,而NoClassDefFoundError是错误。
- 当类路径没有使用所需的JAR文件更新时发生ClassNotFoundException,而当所需的类定义在运行时不存在时发生错误。