📌  相关文章
📜  Java的ClassNotFoundException 与 NoClassDefFoundError

📅  最后修改于: 2021-09-14 01:17:30             🧑  作者: Mango

ClassNotFoundExceptionNoClassDefFoundError都会在运行时找不到类时发生。它们与Java类路径有关。

类未找到异常

ClassNotFoundException的当您尝试使用Class.forName在运行时加载类()或发生在类路径中找不到loadClass()方法和请求的类。大多数情况下,当您尝试运行应用程序而不使用 JAR 文件更新类路径时,会发生此异常。此异常是从Java.lang.Exception类派生的受检异常,您需要为它提供显式处理。当您有两个类加载器并且 ClassLoader 尝试访问由Java的另一个类加载器加载的类时,也会发生此异常。您一定想知道Java的类加载器到底是什么。 Java ClassLoader是Java Runtime Environment 的一部分,它在 JVM( Java虚拟机)中动态加载Java类。由于类加载器, Java运行时系统不需要了解文件和文件系统。
ClassNotFoundException 在下面的程序中引发,因为在类路径中找不到类“GeeksForGeeks”。

// Java program to illustrate
// ClassNotFoundException
public class Example {
      
    public static void main(String args[]) {
        try 
        {
            Class.forName("GeeksForGeeks");
        }
        catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        }
    }
}


输出

java.lang.ClassNotFoundException: GeeksForGeeks

NoClassDefFoundError

NoClassDefFoundError 当在编译期间存在类并且程序已成功编译和链接但在运行期间存在类时会发生 NoClassDefFoundError。它是从LinkageError派生的错误。当一个类对另一个类有一些依赖,并且在前一个类编译后后一个类发生变化时,就会发生链接错误。 NoClassFoundError 是由于调用方法或从该类访问变量而隐式加载类的结果。此错误较难调试并找出发生此错误的原因。因此,在这种情况下,您应该始终检查依赖于此类的类。
注意:此程序不会在 IDE 上运行。尝试在您自己的系统上运行它。
首先为一个Java程序创建任意两个类并将它们链接起来。

// Java program to illustrate
// NoClassDefFoundError
class GeeksForGeeks 
{
    void greeting()
    {
        System.out.println("hello!");
    }
}
  
class G4G {
    public static void main(String args[]) 
    {
        GeeksForGeeks geeks = new geeksForGeeks();
        geeks.greeting();
    }
}

以上程序将被成功编译并生成两个类 GeeksForGeeks.class 和 G4G.class 。
现在删除 GeeksForGeeks.class 文件并运行 G4G.class。
在Java运行时NoClassDefFoundError将被抛出。

ClassNotFoundException 与 NoClassDefFoundError

  • 顾名思义,ClassNotFoundException 是一个异常,而 NoClassDefFoundError 是一个错误。
  • ClassNotFoundException 当类路径没有使用所需的 JAR 文件更新时发生,而当所需的类定义在运行时不存在时会发生错误。