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运行时系统不需要了解文件和文件系统,因为有类加载器。
示例:
// Java Program to Illustrate ClassNotFoundException
public class GFG {
// Main driver method
public static void main(String args[])
{
// Try block to check for exceptions
try {
Class.forName("GeeksForGeeks");
}
// Catch block to handle exceptions
catch (ClassNotFoundException ex) {
// Displaying exceptions on console along with
// line number using printStackTrace() method
ex.printStackTrace();
}
}
}
输出:
ClassNotFoundException会在上述程序中引发,因为类“GeeksForGeeks”在类路径中找不到。
NoClassDefFoundError
现在讨论下一个异常NoClassDefFoundError,它发生在类在编译时存在,程序编译和链接成功,但类在运行时不存在的情况下。这是一个派生自LinkageError的错误。当一个类对另一个类有一些依赖关系,并且编译前一个类之后后一个类发生了更改时,就会发生链接错误。NoClassFoundError是类隐式加载的结果,因为调用了该类中的方法或访问了该类中的变量。此错误更难以调试和查找发生此错误的原因。在这种情况下,你应该检查依赖于这个类的类。为了说明这一点,让我们首先为一个java程序创建两个类并将它们链接起来。
示例:
// Java Program to Illustrate NoClassDefFoundError Exception
// Class 1
// Helper class
class GeeksForGeeks {
// Method
void greeting()
{
// Print statement whenever method is called
System.out.println("hello!");
}
}
// Class 2
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Creating object of class 1
// inside main() in class2
GeeksForGeeks geeks = new GeeksForGeeks();
// Calling method of above class
geeks.greeting();
}
}
输出
hello!
输出的解释:
以上程序将成功编译并生成两个类 “GeeksForGeeks.class” and “GFG.class。” 现在删除GeeksForGeeks.class文件,当我们看到在Java运行时将抛出NoClassDefFoundError时,运行gfg.class。
ClassNotFoundException Vs NoClassDefFoundError
- 顾名思义,ClassNotFoundException是异常,而NoClassDefFoundError是错误。
- 当类路径没有使用所需的JAR文件更新时发生ClassNotFoundException,而当所需的类定义在运行时不存在时发生错误。