Java 中找不到或加载主类错误

2025年03月24日 | 阅读 5 分钟

在 Java 编程语言中遇到错误和异常是很常见的。但对于刚接触编程的程序员来说,一些最流行和最常见的错误通常会让他们感到困扰。在这些错误中,Java 中找不到或加载主类是经常发生的错误之一。该错误表明 java 命令未能 找到或加载主类。当我们尝试运行程序时就会发生这种情况。当发生错误时,JVM 会在控制台上显示以下错误消息:

该错误通常在我们试图在运行时不正确地指定类名时产生。

错误发生的原因

该错误之所以产生,是因为 JVM 未能加载主类或包名。还有一些其他原因会产生相同的错误,如下所示:

  • 类被声明在错误的包中。
  • CLASSPATH 中缺少依赖项。
  • 子目录路径与完全限定名不匹配。
  • CLASSPATH 中存在错误的目录。
  • 应用程序的 CLASSPATH 指定不正确。
  • 当我们对类名参数出错时,也会发生此错误。

理解 Java 错误“找不到或加载主类”

Java 中的“找不到或加载主类”错误通常发生在 Java 无法定位或加载指定为程序主入口点的类时。理解 Java 的类加载机制可以阐明为什么会发生此错误。

Java 的动态类加载

Java 在程序执行期间需要时会动态地将类加载到内存中。这与 C++ 等静态编译语言不同。以下是 Java 类加载机制的概述:

  • 初始加载:当 Java 程序启动时,Java 运行时环境 (JRE) 会使用本地类加载器加载执行期间指定的主类。
  • 类加载器层级:Java 在类加载中使用分层委托模型,该模型涉及三个主要的内置类加载器:
    1. 引导类加载器:加载位于 rt.jar 中的核心 Java 运行时类。
    2. 扩展类加载器:加载扩展目录 (jre/lib/ext) 中的类。
    3. 系统类加载器:加载执行期间指定的类路径中的类。
  • 委托原则:每个类加载器首先检查请求的类是否已缓存在内存中。如果找不到,它会将请求委托给其父类加载器。
  • 解析:如果在任何级别的类加载器都找不到该类,它会将搜索委托给其父加载器,并沿着此链直到引导类加载器。如果都没有找到该类,则会抛出 ClassNotFoundException。

类加载机制的重要性

  • 唯一性:确保每个类在内存中都有唯一的表示。
  • 可见性:定义类加载器之间的父子关系,允许子加载器看到父加载器加载的类,但反之则不然。
  • 委托:通过将类加载职责委托给上层,直到解析,从而促进高效加载。

Java 类加载顺序

  1. 缓存检查:类加载器首先检查其缓存以查找请求的类。
  2. 委托:如果未缓存,它会将请求委托给其父加载器。
  3. 引导加载器:如果所有父加载器都找不到该类,引导加载器将负责加载核心 Java 类。
  4. 异常处理:如果没有加载器能找到该类,则会抛出 ClassNotFoundException。

自定义类加载器

开发人员可以通过扩展 ClassLoader 类来创建自定义类加载器。它对于类版本控制、动态类创建或切换实现等场景很有用。

DemoClass.java

理解 Java 的类加载机制有助于诊断和修复“找不到或加载主类”错误,确保 Java 应用程序正常运行。

如何修复错误:“找不到或加载主类”?

Java 中的“找不到或加载主类”错误通常是由于各种原因引起的,例如类名不正确、文件路径不正确或类路径配置问题。以下是一些解决此错误的有效技巧:

  1. 验证类名:确保指定的类名与包含 main 方法的类完全匹配。Java 是区分大小写的,因此请检查拼写和大小写。
  2. 避免 .class 扩展名:使用 java 命令运行 Java 程序时,请不要包含 .class 扩展名。只使用类名。例如,使用 java MainClass 而不是 java MainClass.class。
  3. 正确的文件路径:仔细检查 .class 文件的路径。如果您的类位于一个包中,请使用完全限定类名(例如,com.example.MainClass),并确保目录结构与包结构匹配。
  4. 类路径配置:如果您的程序依赖于外部库或类文件位于默认目录之外,请验证并正确设置类路径。在执行 java 命令时,使用 -cp 或 -classpath 选项指定类路径。

错误的解决方案

为避免或解决此错误,我们需要指定绝对包名或类名。

没有包

主类是指定义了 main() 方法的类。让我们创建一个程序,该程序会在控制台上生成并显示错误。

DemoClass.java

输出

Could Not Find or Load Main Class in Java

我们看到上面的程序编译并成功运行。让我们生成一个错误,即在上面的程序中找不到或加载主类。要生成并显示错误,我们在键入 java 命令时拼错了类名java DemoClas

Could Not Find or Load Main Class in Java

当我们指定类名末尾的.class 扩展名时,也会发生此情况。


Could Not Find or Load Main Class in Java

为避免此错误,在使用 java 命令时,请勿在类名末尾写 .class 扩展名。

当我们没有将类放在正确的文件夹中时,也会发生此错误。在下面的图像中,我们不在类所在的 demo 文件夹内。这意味着 DemoClass.class 文件必须位于目录 C:\demo 中。

Could Not Find or Load Main Class in Java

带包

在上面的程序中,让我们创建一个名为 com.javatpoint 的包。这意味着,在编译下面的 Java 程序时,.class 文件将在 C:\demo\com\javatpoint\DemoClass.class 中生成。

Could Not Find or Load Main Class in Java

DemoClass.java

输出

Could Not Find or Load Main Class in Java

请记住,如果类位于包内,则必须在 java 命令中使用完整的类名,包括包名。