3年前 (2021-02-07)  Java系列 |   抢沙发  26383 
文章评分 2 次,平均分 5.0

找不到或无法加载主类怎么解决?

Error: Could not find or load main class HelloWorld,当您试图使用Java命令运行Java程序时,主类为HelloWorld,但Java无法找到该类。为了解决这个错误,您必须知道Java是如何查找和加载类的,这对于初学者来说有点复杂,但是我们在这里将讨论相同的基础。现在,您只需记住,有一个名为CLASSPATH的环境变量,其中包含Java在其中查找所有类文件的目录,如果在那里找不到主类,则抛出“Error:Could not find or load main class XXX”,其中XXX是主类的名称。

由于许多Java程序员现在开始使用Eclipse编程,当他们第一次尝试从命令行运行Java程序时,就会遇到这个问题。在Eclipse中,编译和运行程序很容易,因为Eclipse负责所有的类路径设置,但是当您从命令行运行Java程序时,类路径环境变量就出现了。

就我个人而言,我不喜欢这个环境变量,也不在我的环境变量中定义它,因为它让人困惑,而且是许多类路径相关问题的根源。相反,我在java命令中使用-cp-classpath选项来运行我的程序。这样,您就可以知道类路径中包含哪些jar。

对于初学者来说,另一个需要了解的重要内容是PATH和CLASSPATH之间的区别,您必须知道PATH用于定位系统可执行文件、命令或.exe、.dll文件(在Windows中)和.so文件(在Linux中)。它还用于定位Java程序使用的本机库。而CLASSPATH用于定位类文件或JAR文件。Java类加载器查看类路径以加载类。详细讲解可以参考上一篇文章:https://javakk.com/1498.html

回到手头的问题,如果您是Java初学者,能够从Eclipse运行程序,但在尝试从命令行运行同一程序时遇到“错误:找不到或无法加载主类HelloWorld”,请按照这里给出的步骤来解决。

解决错误:无法找到或加载主类HelloWorld

不幸的是,许多开发人员用来学习Java的入门书并没有教您如何处理这种错误。你需要通过积极的发展来培养这种技能。为了更好地理解这个问题,让我们重现一下。这是一个最重要的故障排除技巧,这将有助于你在你的职业生涯很长的路。当你能够重现它时,一半的问题就解决了。

出于我们的目的,我们将使用以下HelloWorld程序进行测试,有趣的是,我将其命名为HelloHP,它驻留在一个名为“dto”的包中。我特意选择了一个带有包的类,而不是默认包中的HelloWorld,因为许多程序员在尝试运行包中的类时会出现“找不到或无法加载主类”错误。

package dto;
/**
 * Simple Java program to demonstrate following error
 * Error :Could not find or load main class
 * 
 * @author Javin Paul
 */
public class HelloHP {

    public static void main(String args[]) {
        System.out.println("My first program in Java, HelloWorld !!");
       
    }

}

当您从Eclipse运行此程序时,右键单击源文件并选择“以Java程序运行”,它将正常运行并打印以下行:

My first program in Java, HelloWorld !!

一切如预期,现在我们将尝试从命令行运行相同的Java程序。因为我将Maven与Eclipse一起使用,所以它的构建过程在project_directory\target\classes目录中创建类文件。如果您没有在Eclipse中使用Maven,那么您可以在project_directory\bin中看到Eclipse的Java编译器创建的类文件。这些类文件是如何创建的并不重要,重要的是类文件的位置。

如果你的类在一个非默认包中,比如在我们的例子中的“dto”,那么编译器将把HelloHP.class文件,它在名为“dto”的目录中包含Java字节码。在我们的例子中,全名是HelloHP.class它出现在C:\Users\windows8\workspace\Demo\target\classes\dto中。因此,在第一次尝试中,我执行java命令来启动我的程序,如下所示:

C:\Users\WINDOWS 8\workspace\Demo\target\classes\dto>java HelloHP 
Error: Could not find or load main class HelloHP

你看到错误了吗?因为全名应该是dto.HelloHP而不是HelloHP。因此,让我们更正此错误,并尝试从同一位置运行同一命令,但这次使用完全限定名:

C:\Users\WINDOWS 8\workspace\Demo\target\classes\dto>java dto.HelloHP 
Error: Could not find or load main class dto.HelloHP

还是一样的错误,对吧。为什么?因为我没有任何CLASSPATH环境变量,所以我也没有使用-CLASSPATH-cp选项来建议路径,所以默认情况下Java只在当前目录中搜索。它正在寻找dto/HelloHP.class但由于我们已经在dto中,因此无法找到类。那么,我们现在该怎么办?让我们转到父目录“C:\Users\windows8\workspace\Demo\target\classes”并执行相同的命令,这次应该可以:

C:\Users\WINDOWS 8\workspace\Demo\target\classes\dto>cd .. 
C:\Users\WINDOWS 8\workspace\Demo\target\classes>java dto.HelloHP 
My first program in Java, HelloWorld !!

答对 了!!,我们的程序成功运行是因为,在没有任何关于在何处查找类文件的提示的情况下,Java默认情况下会查找当前目录,用表示.(点)并且能够定位。/dto/HelloHP.class.

现在,如果你想从其他目录运行这个程序呢?那么,为了这个目的,我们是需要定义类路径还是只使用-CLASSPATH-cp选项。我喜欢第二种选择,因为它更容易控制和改变。另外,请记住,它会覆盖任何CLASSPATH环境变量。如果您想在Windows中设置CLASSPATH环境变量,请参阅该教程。

现在让我们先运行程序目标目录,而不使用-classpath选项:

C:\Users\WINDOWS 8\workspace\Demo\target\classes>cd .. 
C:\Users\WINDOWS 8\workspace\Demo\target>java dto.HelloHP 
Error: Could not find or load main class dto.HelloHP

你可以看到我们又开始犯同样的错误,为什么?因为Java仍在查找当前目录,并且没有.\target\dto\HelloHP.class在那里,因为它是向下一级的,例如…\target\classes\dto\HelloHP.class

现在让我们从目标目录本身使用-classpath选项运行相同的命令:

C:\Users\WINDOWS 8\workspace\Demo\target>java -cp ./classes;. dto.HelloHP 
My first program in Java, HelloWorld !!

答对 了!!,我们的程序再次成功运行,因为现在Java也在查看./classes目录,在那里它可以找到dto\HelloHP.class文件。

错误有很多种方式:无法找到或加载主类HelloWorld清单本身,但是如果您了解Java类路径的基本知识,就可以很容易地解决问题。大多数情况下,您只需要更正CLASSPATH环境变量或使用java-cp-CLASSPATH选项运行程序。

总结

如果出现“错误:找不到或无法加载主类XXX”,其中XXX是运行Java程序时主类的名称,请执行以下操作以解决该错误:

1. 如果您正从.class文件所在的目录运行Java程序,并且定义了CLASSPATH环境变量,那么请确保它包含当前目录.(点)。可以将其包含为set CLASSPATH=%CLASSPATH%;。在Windows和export中,CLASSPATH = ${CLASSPATH}:.(请参阅分隔符,在Windows中是;(分号),而在Linux中是(冒号),还要注意,我们在现有的类路径中包含了当前目录。如果您仍然面临设置类路径的问题,请参阅本逐步指南来设置类路径。如果您使用-cp-classpath选项运行程序,同样的情况也适用。

2. 如果您是从目录运行Java程序,那么您的.class文件是,并且您没有任何CLASSPATH-cp选项,那么请检查您的类是否在包中。如果它在包中,则跳出包目录并用完全限定名运行java命令,例如,如果您的程序是com.abc包然后从“com”的父目录运行以下命令

java:com.abc.HelloWorld

如果没有任何类路径提示,Java将查找当前目录并搜索com\abc\HelloWorld.class类在Windows中,如果当前目录中存在com目录,则程序将运行,否则会出现“错误:找不到或无法加载主类HelloWorld".

3. 在适当的类路径或Java-cp选项的帮助下,您可以从任何地方运行Java程序,如下所示:

java -cp C:\test\;. com.abc.HelloWorld

如果您仍然面临任何问题,只需检查是否意外使用了CLASSPATH环境变量,您可以在Windows中通过运行echo%CLASSPATH%命令来检查此问题,在Linux中通过运行echo$CLASSPATH来检查此问题。如果CLASSPATH是非空的,那么它将打印它的值,否则只回显相同的命令。

4. 如果您运行的是Java版本1.6或1.5,那么您将在线程“main”中得到异常:java.lang.NoClassDefFoundError:HelloWorld,而不是收到“Error:Could not find or load main class”。从JDK1.7开始,我们才开始收到这个新错误。解决方法是完全相同的,每一点的讨论也适用于这种情况。

以下是我如何再现和解决上一段中讨论的错误的屏幕截图:

找不到或无法加载主类怎么解决?

这些都是关于如何解决Java中的“错误:找不到或无法加载主类HelloWorld”。类路径对于掌握来说是一个很容易混淆的话题,但是一旦你开始编写和运行一些Java程序,你就会理解它。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1484.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册