解决 Java 中的 'Could Not Find or Load Main Class' 错误

JavaJavaBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在学习 Java 编程时,你不可避免地会遇到各种错误和异常。许多初学者常见的一个错误是 “Could Not Find or Load Main Class” 错误。当 Java 虚拟机(JVM)无法定位或加载包含作为应用程序入口点的 main 方法的类时,就会出现此错误。

在这个实验中,我们将探讨此错误的常见原因,并学习不同的解决方法。通过了解此错误的根本原因,你将能更好地应对未来 Java 编程中遇到的类似问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/ConcurrentandNetworkProgrammingGroup(["Concurrent and Network Programming"]) java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/ObjectOrientedandAdvancedConceptsGroup(["Object-Oriented and Advanced Concepts"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java/BasicSyntaxGroup -.-> java/output("Output") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/classes_objects("Classes/Objects") java/ObjectOrientedandAdvancedConceptsGroup -.-> java/packages_api("Packages / API") java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/io("IO") java/ConcurrentandNetworkProgrammingGroup -.-> java/working("Working") subgraph Lab Skills java/output -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} java/classes_objects -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} java/packages_api -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} java/files -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} java/io -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} java/working -.-> lab-117401{{"解决 Java 中的 'Could Not Find or Load Main Class' 错误"}} end

创建一个简单的 Java 程序

在这一步中,我们将创建一个简单的 Java 程序,以了解 Java 编译和执行的基础知识。

  1. 首先,让我们创建一个新的 Java 文件。在 WebIDE 中,导航到项目目录 (~/project) 并创建一个名为 HelloWorld.java 的新文件。

  2. 将以下代码添加到 HelloWorld.java 文件中:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java World!");
    }
}

让我们来理解这段代码的作用:

  • public class HelloWorld:定义了一个名为 HelloWorld 的公共类
  • public static void main(String[] args):定义了主方法,它是任何 Java 应用程序的入口点
  • System.out.println("Hello, Java World!"):将文本 "Hello, Java World!" 打印到控制台

需要注意的最重要的一点是,类名 (HelloWorld) 与文件名 (HelloWorld.java) 相匹配。这种命名约定在 Java 中至关重要,不遵循它是 “Could Not Find or Load Main Class” 错误的一个常见原因。

  1. 按 Ctrl+S 或从菜单中选择 “文件” > “保存” 来保存文件。

编译并运行你的 Java 程序

现在我们已经创建了 Java 程序,接下来需要对其进行编译和运行。Java 中的编译过程会将你编写的可读代码(源代码)转换为 Java 虚拟机(JVM)能够理解的字节码。

  1. 若 WebIDE 中还未打开终端,可通过点击菜单中的 “终端” > “新建终端” 来打开。

  2. 确保你处于正确的目录下:

cd ~/project
  1. 使用 javac 命令编译 Java 程序:
javac HelloWorld.java

若没有看到任何输出,这意味着编译成功。编译过程会在同一目录下创建一个名为 HelloWorld.class 的文件。这个 .class 文件包含了 JVM 可以执行的字节码。

你可以通过列出目录内容来验证该文件是否创建成功:

ls

你应该会在输出中看到 HelloWorld.javaHelloWorld.class 这两个文件:

HelloWorld.class  HelloWorld.java
  1. 使用 java 命令运行编译后的程序:
java HelloWorld

你应该会看到以下输出:

Hello, Java World!

这表明你的程序已成功编译并执行。

在接下来的步骤中探究 “Could Not Find or Load Main Class” 错误之前,理解这个基本的工作流程至关重要。

理解 “Could Not Find or Load Main Class” 错误

既然我们已经了解了编译和运行 Java 程序的基础知识,接下来让我们探究 “Could Not Find or Load Main Class” 错误及其常见原因。

错误场景 1:类名不匹配

此错误最常见的原因之一是代码中的类名与文件名不匹配。

  1. 创建一个名为 NameMismatch.java 的新文件,并添加以下内容:
public class IncorrectName {
    public static void main(String[] args) {
        System.out.println("This program will cause an error!");
    }
}

注意,类名 (IncorrectName) 与文件名 (NameMismatch.java) 不匹配。

  1. 尝试编译这个文件:
javac NameMismatch.java

编译应该会成功,但会创建一个名为 IncorrectName.class 的文件(与类名匹配,而非文件名)。

  1. 现在尝试使用文件名来运行程序:
java NameMismatch

你会看到以下错误:

Error: Could not find or load main class NameMismatch
Caused by: java.lang.ClassNotFoundException: NameMismatch
  1. 要修复此错误,你应该使用正确的类名来运行程序:
java IncorrectName

现在你应该会看到输出:

This program will cause an error!

错误场景 2:从错误的目录运行

另一个常见原因是尝试从不包含已编译 .class 文件的目录运行 Java 类。

  1. 为本次演示创建一个子目录:
mkdir subdirectory
  1. 切换到这个新目录:
cd subdirectory
  1. 尝试从这个目录运行 HelloWorld 程序:
java HelloWorld

你会看到以下错误:

Error: Could not find or load main class HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
  1. 要修复此错误,你可以选择:

    • 返回到包含 .class 文件的目录:
    cd ..
    java HelloWorld
    • 或者指定类文件的完整路径(我们将在步骤 5 中探讨)

为了进行后续步骤,请返回到项目目录:

cd ~/project

使用 Java 包

Java 中的包(Package)用于将类组织到命名空间中。它们通过避免命名冲突和提供访问控制来帮助管理大型应用程序。然而,错误地使用包也可能导致 “Could Not Find or Load Main Class” 错误。

理解包结构

  1. 首先,让我们为我们的包创建一个目录结构。在 Java 中,包结构必须与目录结构相匹配:
mkdir -p ~/project/com/example
  1. com/example 目录下创建一个名为 PackagedClass.java 的新 Java 文件:
cd ~/project/com/example
  1. PackagedClass.java 中添加以下代码:
package com.example;

public class PackagedClass {
    public static void main(String[] args) {
        System.out.println("This class is in a package!");
    }
}

注意文件顶部的 package com.example; 声明。这告诉 Java 这个类属于 com.example 包。

  1. 返回到项目目录并编译该文件:
cd ~/project
javac com/example/PackagedClass.java
  1. 如果你仅使用类名来运行该类,你会得到一个错误:
java PackagedClass

输出:

Error: Could not find or load main class PackagedClass
Caused by: java.lang.ClassNotFoundException: PackagedClass
  1. 运行包中类的正确方法是使用完全限定类名(包括包名):
java com.example.PackagedClass

现在你应该会看到输出:

This class is in a package!

关于包的重要要点

  • 包声明必须是文件中的第一条语句
  • 目录结构必须与包结构相匹配
  • 运行打包的类时,必须使用完全限定类名
  • 编译命令应包含源文件的路径,但执行命令应使用包名和类名,而不是文件路径

这个包系统是 Java 开发的基础,尤其对于大型应用程序而言。

使用类路径(Classpath)解决类加载问题

类路径(Classpath)是一个参数,它告诉 Java 虚拟机(JVM)在哪里查找类和包。了解如何使用类路径对于解决 “Could Not Find or Load Main Class” 错误至关重要,尤其是在更复杂的项目中。

什么是类路径?

类路径是一个包含类文件的目录、JAR 文件和 ZIP 文件的列表。JVM 在加载和执行你的程序时会使用这个列表来搜索类。

使用类路径参数

让我们创建一个新的目录结构来演示类路径的使用:

  1. 为编译后的类创建一个新目录:
mkdir -p ~/project/classes
  1. 在项目目录中创建一个名为 ClasspathDemo.java 的新 Java 文件:
public class ClasspathDemo {
    public static void main(String[] args) {
        System.out.println("Successfully loaded class using classpath!");
    }
}
  1. 编译 Java 文件,并指定 .class 文件应放置在 classes 目录中:
javac -d classes ClasspathDemo.java

-d 选项指定编译后的类文件的目标目录。你可以验证类文件是否已在指定目录中创建:

ls classes

你应该会看到:

ClasspathDemo.class
  1. 现在,尝试在不指定类路径的情况下运行程序:
java ClasspathDemo

你会看到错误信息:

Error: Could not find or load main class ClasspathDemo
Caused by: java.lang.ClassNotFoundException: ClasspathDemo
  1. 要修复此错误,你需要在运行程序时指定类路径:
java -classpath classes ClasspathDemo

或者你可以使用更简短的 -cp 选项:

java -cp classes ClasspathDemo

现在你应该会看到输出:

Successfully loaded class using classpath!

设置类路径环境变量

你可以设置 CLASSPATH 环境变量,而不是每次运行 Java 程序时都指定类路径:

export CLASSPATH=~/project/classes:$CLASSPATH

设置此环境变量后,你可以在不使用 -classpath 选项的情况下运行程序:

java ClasspathDemo

你应该会看到相同的输出:

Successfully loaded class using classpath!

何时使用类路径

在以下情况下,你需要使用类路径:

  • 你的类不在当前目录中
  • 你正在使用第三方库(JAR 文件)
  • 你有一个包含多个源目录的复杂项目结构
  • 你正在使用像 Maven 或 Gradle 这样的构建工具(它们会为你管理类路径)

对于简单的单文件程序之外的 Java 开发,理解类路径至关重要,并且在更复杂的设置中,它通常是解决 “Could Not Find or Load Main Class” 错误的方法。

总结

在整个实验中,我们探讨了 Java 中常见的 “Could Not Find or Load Main Class” 错误,并学习了几种解决方法。以下是我们所涵盖内容的总结:

  1. 基本的 Java 编译和执行:我们学习了如何使用 javacjava 命令创建、编译和运行一个简单的 Java 程序。

  2. 常见错误原因

    • 代码中的类名与文件名不匹配
    • 从错误的目录运行程序
    • 错误地使用包
    • 类路径(Classpath)问题
  3. 使用包:我们探究了 Java 中包的工作原理,包括包结构与目录结构之间的关系,以及如何正确执行打包的类。

  4. 使用类路径:我们学习了如何使用类路径选项来告诉 JVM 在哪里查找类,这对于复杂项目特别有用。

“Could Not Find or Load Main Class” 错误一开始可能会让你感到沮丧,但了解其原因后,诊断和修复它就会容易得多。请记住以下关键点:

  • 代码中的类名必须与文件名(不包括 .java 扩展名)匹配
  • 使用包时,目录结构必须与包结构相匹配
  • 始终从正确的目录运行 Java 程序,或者使用类路径来指定类的位置
  • 对于打包的类,运行程序时要使用完全限定类名(包括包名)

通过掌握这些概念,你将能够在 Java 开发过程中避免或快速解决这个常见错误。