Java ClassNotFoundException - java.lang.ClassNotFoundException
Java 类未找到异常
- 当应用程序尝试加载一个类但Classloader无法在类路径中找到它时,就会发生 Java ClassNotFoundException。
- 常见的原因
java.lang.ClassNotFoundException
是使用Class.forName
或ClassLoader.loadClass
通过传递类的字符串名称来加载类,但在类路径中找不到该类。 - ClassNotFoundException 是一个已检查异常,因此必须捕获或抛出给调用者。
- ClassNotFoundException 总是在运行时发生,因为我们使用 Classloader 间接加载类。Java 编译器无法知道该类在运行时是否存在于类路径中。
- ClassNotFoundException 最常见的例子之一是当我们尝试加载JDBC 驱动程序但
Class.forName
忘记在类路径中添加它的 jar 文件时。
Java ClassNotFoundException 示例
让我们看一个简单的例子,我们将得到ClassNotFoundException
。
package com.journaldev.exceptions;
public class DataTest {
public static void main(String[] args) {
try {
Class.forName("com.journaldev.MyInvisibleClass");
ClassLoader.getSystemClassLoader().loadClass("com.journaldev.MyInvisibleClass");
ClassLoader.getPlatformClassLoader().loadClass("com.journaldev.MyInvisibleClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
请注意com.journaldev.MyInvisibleClass
不存在,因此当我们执行上述程序时,我们得到以下异常堆栈跟踪。
java.lang.ClassNotFoundException: com.journaldev.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.journaldev.exceptions.DataTest.main(DataTest.java:7)
在上面的例子中,所有三个语句都会抛出java.lang.ClassNotFoundException
。
如何解决 ClassNotFoundException
修复 ClassNotFoundException 非常容易,因为异常堆栈跟踪明确指定了未找到的类。只需检查类路径设置并确保该类在运行时存在即可。
ClassNotFoundException 与 NoClassDefFoundError
NoClassDefFoundError
是运行时找不到类时抛出的运行时错误。它与 非常相似ClassNotFoundException
。更多信息请阅读Java NoClassDefFoundError。参考:API 文档