当在运行时找不到类时,会发生 ClassNotFoundExceptionNoClassDefFoundError 这两个异常。它们与 Java 类路径有关。

1、ClassNotFoundException

当尝试在运行时使用 Class.forName()loadClass() 方法加载类并且在类路径中找不到请求的类时,会发生 ClassNotFoundException。大多数情况下,当尝试运行应用程序而不使用 JAR 文件更新类路径时,会发生此异常。此异常是从 java.lang.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("Yiibai");
        }

        // Catch block to handle exceptions
        catch (ClassNotFoundException ex) {

            // Displaying exceptions on console along with
            // line number using printStackTrace() method
            ex.printStackTrace();
        }
    }
}

运行结果出错,如下所示:

注:由于在类路径中找不到类“Yiibai”,因此在上述程序中引发了:ClassNotFoundException

NoClassDefFoundError

下面来讨论下一个异常,即 NoClassDefFoundError 在编译期间存在类并且程序已成功编译和链接但在运行时不存在该类时发生。 这是一个源自 LinkageError 的错误。 当一个类对另一个类有一些依赖,而后一个类在前一个类编译后发生变化时,就会发生链接错误。 NoClassFoundError 是由于调用方法或从该类访问变量而隐式加载类的结果。 这个错误比较难调试,也很难找到这个错误发生的原因。 因此,在这种情况下,应该始终检查依赖于此类的类。 为了说明,首先为 java 程序创建任意两个类并将它们链接起来。

例子

// Java Program to Illustrate NoClassDefFoundError Exception

// Class 1
// Helper class
class Yiibai {

    // 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
        Yiibai geeks = new Yiibai();

        // Calling method of above class
        geeks.greeting();
    }
}

运行结果:

hello!

上面的程序将成功编译并生成两个类“Yiibai.class”和“GFG.class”。现在删除 Yiibai.class 文件并运行 GFG.class,在 Java 运行时会抛出 NoClassDefFoundError 时。

ClassNotFoundException 与 NoClassDefFoundError 的区别

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