Java中ClassNotFoundException 和 NoClassDefFoundError的区别

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();
        }
    }
}

输出:

Java中ClassNotFoundException 和 NoClassDefFoundError的区别

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,而当所需的类定义在运行时不存在时发生错误。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程