为什么Java类存在时,我们仍然会遇到ClassNotFoundException?
当我们尝试加载一个类时,如果类加载器无法在指定的路径找到该类,则会生成一个ClassNotFoundException。
这可能发生在执行Java程序时,使用名为Class的类的forName()方法或ClassLoader类的loadClass()方法显式加载类时。这两个类都接受表示类名的字符串值并加载指定的类。
向这些方法传递类名时,需要注意以下几点:
传递给这些方法的类名必须准确。
指定的类(及其包)应该位于当前目录中,或者其路径应该列在环境变量classpath中。
示例
假设我们在D://目录中创建了一个名为Sample的类,并按如下所示进行编译:
package myPackage.example;
public class Sample {
static {
System.out.println("The class named Sample loaded successfully.........");
}
}编译
D:\>javac -d . Sample.java
这将在当前目录中创建myPackage.example包,并在其中生成Sample类的.class文件。因此,加载此类时,需要将其放在同一目录中,并将绝对类名传递给Class.forName()或loadClass()。
示例
public class ClassNotFoundExample {
public static void main(String args[]) {
try {
Class.forName("myPackage.exampl.Sample");
}catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
}异常
执行上述程序时,由于包名拼写错误,您将收到以下异常。
D:\>java ClassNotFoundExample java.lang.ClassNotFoundException: myPackage.exampl.Sample at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Unknown Source) at ClassNotFoundExample.main(ClassNotFoundExample.java:4)
如果您尝试从另一个目录访问特定类,则需要设置类路径为:
包含.class文件的文件夹(最外层包)。
或者,
包含该类的jar文件。
假设我们已经纠正了拼写错误,并尝试从位于E://目录中的Java文件加载类。
示例
public class ClassNotFoundExample {
public static void main(String args[]) {
try {
Class.forName("myPackage.example.Sample");
}catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
}
}异常
您仍然会收到相同的异常,因为包含指定类.class文件的包(或包含它的jar文件)既不在当前目录中,也不在环境变量classpath的路径列表中。
E:\>java ClassNotFoundExample java.lang.ClassNotFoundException: myPackage.example.Sample at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source) at java.base/java.lang.ClassLoader.loadClass(Unknown Source) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Unknown Source) at ClassNotFoundExample.main(ClassNotFoundExample.java:4)
在当前情况下,将类路径设置为包含持有所需类的包的目录,即“D://”,然后执行上述Java程序即可使其工作。
E:\>javac ClassNotFoundExample.java E:\>java ClassNotFoundExample The class named Sample loaded successfully.........
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP