修复 Java 中无法找到或加载主类错误
本教程介绍了 Java 中无法找到或加载主类错误。
假设我们已经编写了一段代码并编译了它。到目前为止,一切正常,但是当我们最终运行它时,出现了一个错误。
could not find or load main class
本教程将讨论为什么会发生此错误以及如何解决它。让我们首先回顾一下如何使用命令提示符运行 java 程序。
首先,我们使用 javac 命令编译代码,如下所示:
javac < .java file name>
执行上述命令后,将在当前文件夹中创建一个扩展名为 .class
的文件。
.class
文件将具有与 .java
程序相同的类。然后我们使用以下命令运行 .class
文件来执行 Java 代码:
java <classname>
我们可能会收到 could not find or load main class
错误。此错误是运行时错误,当 Java 虚拟机无法找到我们试图运行的主类(包含 main 方法的类)时发生。
此错误最常发生在使用命令提示符运行我们的 Java 程序时。在讨论这个错误的原因之前,让我们先了解一下 CLASSPATH。
Java 中的类路径
这是 executable.class
和其他资源文件。
JVM 使用它来定位文件。除非我们在系统变量中明确设置 CLASSPATH,否则默认的 CLASSPATH 是当前目录。
要运行程序,我们需要传递类名。我们以下面的例子来说明这一点:
public class DelftStack{
public static void main(String args[]){
System.out.println("Hello from DelftStack");
}
}
让我们首先使用 javac 命令编译它:
C:\Users\User\Documents\DelftStack\java>javac DelftStack.java
C:\Users\USer\Documents\DelftStack\java>
执行上述命令后,在当前目录中创建了一个 DelftStack.class
文件。让我们使用 java 命令运行该文件。
C:\Users\User\Documents\DelftStack\java>java DelftStack.class
Error: Could not find or load main class DelftStack.class
Caused by: java.lang.ClassNotFoundException: DelftStack.class
在这里,我们得到一个错误,因为我们正在尝试运行 .class
文件。相反,我们只需要传递类名。
往下看:
C:\Users\User\Documents\DelftStack\java>java DelftStack
Hello from DelftStack
在 Java 中由于传递了错误的名称而无法找到错误
当我们传递错误的类名时,也可能出现找不到或加载主类
。继续前面的示例,如果我们尝试使用错误的名称运行程序,如下所示:
C:\Users\User\Documents\DelftStack\java>java DelftStac
Error: Could not find or load main class DelftStac
Caused by: java.lang.ClassNotFoundException: DelftStac
我们收到上面的错误是因为我们拼错了类名。在这里,JVM 试图运行一个名为 DelftStac
的类,但它并不存在。
我们可以通过正确拼写类名来解决这个问题,如下所示:
C:\Users\User\Documents\DelftStack\java>java DelftStack
Hello from DelftStack
我们还应该注意,类名是区分大小写的。如果我们运行类 Delftstack
,我们会得到一个错误。
往下看:
C:\Users\User\Documents\DelftStack\java>java Delftstack
Error: Could not find or load main class Delftstack
Caused by: java.lang.NoClassDefFoundError: Delftstack (wrong name: Delftstack)
我们应该使用正确的拼写和正确的大小写来成功运行文件。
由于 Java 中的包名称错误,无法找到错误
让我们将 DelftStack
类移动到 com.DelftStack
包中。包用于将相似的类保持在一起。
看下面的代码:
package com.DelftStack;
public class DelftStack{
public static void main(String args[]){
System.out.println("Hello from DelftStack");
}
}
要在 Java 中编译包,我们使用以下命令:
javac -d . <.java file name>
-d
标志开关用于告诉将生成的类文件保存在哪里。这 。
表示当前目录。
我们将上面的代码编译如下:
C:\Users\User\Documents\DelftStack\java>javac -d . DelftStack.java
执行上述命令后,在我们的当前目录中创建了以下文件夹结构。
com\DelftStack\DelftStack.class
正如我们所看到的,我们的类文件是我们当前目录深处的两个文件夹。因此,如果我们尝试像以前那样运行我们的类文件,我们会得到一个错误。
C:\Users\User\Documents\DelftStack\java>java DelftStack
Error: Could not find or load main class DelftStack
Caused by: java.lang.ClassNotFoundException: DelftStack
此错误的原因是当前文件夹中不存在 DelftStack
类。要运行包中存在的类,我们需要传递其完全限定名称(在本例中为 com.DelftStack.DelftStack
)。
C:\Users\User\Documents\DelftStack\java>java com.DelftStack.DelftStack
Hello from DelftStack
这告诉 Java 在 com\DelftStack
文件夹中查找类。
由于 Java 中的 CLASSPATH 错误,无法找到错误
CLASSPATH 告诉 JVM .class
文件在哪里。
假设我们当前在不同的文件夹中,并且我们想要运行一个 Java 程序,其类文件存在于不同的文件夹中。在这种情况下,我们可以使用 -classpath
选项传递类文件的位置。
例如:
java -classpath XYZ/ABC <class name>
上面的命令告诉 Java 在 ZYX/ABC
文件夹中查找 .class
文件。
在前面的例子中,我们创建了一个包。
假设我们要运行 com/DelftStack
文件夹中的文件。使用以下命令,我们可以这样做:
>java -classpath ../../ com.DelftStack.DelftStack
Hello from DelftStack
../
表示父目录。所以 ../../
意味着查找两个目录级别。
让我们再举一个例子,假设我们在桌面(文件夹)位置,我们想在计算机的其他地方运行一个类文件。我们可以通过以下方式做到这一点。
>java -cp C:\Users\User\Documents\DelftStack\java com.DelftStack.DelftStack
Hello from DelftStack
-cp
标志是 -classpath
的简写。在这里,我们传递了存在 .class
文件的文件夹的完整位置。