如何解决Java类找不到异常(ClassNotFoundException):完整指南

Java中的ClassNotFoundException

  • 当应用程序尝试加载一个类,但类加载器(Classloader)无法在类路径(classpath)中找到该类时,就会发生Java ClassNotFoundException异常。
  • java.lang.ClassNotFoundException的常见原因是使用Class.forName或ClassLoader.loadClass方法通过传递类的字符串名称来加载类,但该类在类路径中未找到。
  • ClassNotFoundException是一个受检异常(checked exception),因此必须被捕获或抛给调用者。
  • ClassNotFoundException总是在运行时发生,因为我们是使用类加载器间接加载类。Java编译器无法知道类在运行时是否会存在于类路径中。
  • ClassNotFoundException最常见的例子之一是当我们尝试使用Class.forName加载JDBC驱动程序,但忘记将其JAR文件添加到类路径中。

Java 类找不到异常示例

我们来看一个简单的例子,其中我们将会得到ClassNotFoundException异常。

package com.Olivia.exceptions;

public class DataTest {

  public static void main(String[] args) {
    try {
      Class.forName("com.Olivia.MyInvisibleClass");

      ClassLoader.getSystemClassLoader().loadClass("com.Olivia.MyInvisibleClass");

      ClassLoader.getPlatformClassLoader().loadClass("com.Olivia.MyInvisibleClass");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
  }

}

请注意,com.Olivia.MyInvisibleClass并不存在,所以当我们执行以上程序时,会得到以下异常堆栈跟踪。

java.lang.ClassNotFoundException: com.Olivia.MyInvisibleClass
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:292)
	at com.Olivia.exceptions.DataTest.main(DataTest.java:7)

在上述示例中,所有三个语句都会引发java.lang.ClassNotFoundException异常。

如何解决ClassNotFoundException

修复ClassNotFoundException非常容易,因为异常堆栈中明确指定了找不到的类。只需检查类路径(classpath)设置,并确保类在运行时存在即可。

类找不到异常 vs 类定义未找到错误

当一个类在运行时找不到时,NoClassDefFoundError(类定义未找到错误)是一个运行时错误。它与ClassNotFoundException(类找不到异常)非常相似。在Java NoClassDefFoundError中了解更多。参考:API文档

bannerAds