为什么当 Java 中存在该类时,我们会得到 ClassNotFoundException?

javaobject oriented programmingprogramming更新于 2024/8/26 10:32:00

每当我们尝试加载一个类时,如果类加载器无法在指定路径找到该类,就会生成 ClassNotFoundException

这可能发生在执行 Java 程序时,使用名为 Class 的类的 forName() 方法或 ClassLoader 类的 loadClass() 方法显式加载类。这两个类接受表示类名的字符串值并加载指定的类。

在将类名传递给这些方法时,您需要确保 −

  • 传递给这些方法的类名应该准确无误。

  • 指定的类(连同包)应该位于当前目录中,或者其路径应列在环境变量 classpath 中。

示例

假设我们在目录 D:// 中创建了一个名为 Sample  的类,并按如下所示进行编译 −

package myPackage.example;
public class Sample {
   static {
        System.out.println("名为 Sample 的类已成功加载.........");
   }
}

编译

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(未知来源)
   at ClassNotFoundExample.main(ClassNotFoundExample.java:4)

如果您尝试从另一个目录访问特定类,则需要为 − 设置类路径

  • 包含 .class 文件的文件夹(最外层包)。

    或者,

  • 包含该类的 jar 文件。

假设,我们已经纠正了拼写问题并尝试从目录 E:// 中的 Java 文件加载该类

示例

public class ClassNotFoundExample {
   public static void main(String args[]) {
      尝试 {
         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.........

相关文章