找不到或加载主类

24

我使用Windows 7操作系统,已安装jdk1.7.0及其支持的jre7。
我的问题是编译部分完美运行,但在运行Java程序时,我遇到了以下错误:

"无法找到或加载主类"

我将所有程序存储在名为javalab的文件夹中,并设置了路径。该过程如下所示:

C:\Users\user>cd\
C:\>cd javalab
C:\javalab>autoexec.bat
C:\javalab>set path=C:\Program Files\Java\jdk1.7.0\bin
C:\javalab>javac p1.java
C:\javalab>java p1 Error: Could not find or load main class p1
C:\javalab>

你的p1.java文件是否在某个包内? - Santosh
1
p1.java 的内容是什么样子的?它包含一个名为 p1 的类吗(大小写敏感)?它包含一个 package 语句吗? - Joachim Sauer
你能描述并展示p1.java的代码吗?你的p1.java是否有main方法? - Sal
可能是“Could not find or load main class”是什么意思?的重复问题。 - Enamul Hassan
16个回答

28

我的第一个Java程序也遇到了类似的问题。

我执行了这个命令

java HelloWorld.class

导致出现了相同的错误。

原来需要排除掉“.class”。

java HelloWorld

12

尝试:

java -cp . p1

当我在使用 Fedora (linux) 时遇到相同的问题,这个方法对我有用。


谢谢,对我有用。在执行之前,我使用了以下命令:export classpath=$classpath:/usr/local/share/java/zmq.jar:。最后的“.”很重要。 - Pinaki Mukherjee

9

编译和执行Java文件的简单方法。(HelloWorld.java不包含任何包)

set path="C:\Program Files (x86)\Java\jdk1.7.0_45\bin"
javac "HelloWorld.java"
java -cp . HelloWorld
pause

6

javac需要知道在哪里搜索类。尝试这样做:

javac -cp . p1.java

您应该不需要特别指定类路径。您确定文件p1.java存在吗?



4

我遇到了几乎相同的问题,但有以下变化:

  1. 我从PC1导入了一个已经准备好的Maven项目到Eclipse IDE中(该项目在那里完美运行)到另一台PC2上。
  2. 当我尝试在PC2上运行该项目时,出现了相同的错误“找不到或加载主类”。
  3. 我检查了PATH变量(在我的情况下有很多值),并添加了JAVA_HOME变量(在我的情况下是JAVA_HOME = C:\Program Files\Java\jdk1.7.0_03)。重启Ecplise后仍然无法解决问题。
  4. 我尝试在PC2上运行简单的HelloWorld.java文件(在另一个项目中)- 它可以正常工作。
  5. 所以我将HelloWorld类添加到最近导入的项目中,在那里执行它 - 哦 - 我的主类在该项目中也开始正常运行了。

这种行为非常奇怪,我无法完全理解它。希望它也能帮助其他人。


3

首先,请检查您的类名。根据批处理文件说明,它应该是p1。然后,检查该类的包是否存在,如果存在,请在运行时指定。

如果包是x.y

java x.y.p1

3

在经过了很多疑难排解后,这是我的工作环境路径变量。

CLASSPATH

.;C:\Program Files (x86)\Java\jre7\lib\ext\QTJava.zip;C:\Program Files (x86)\Java\jdk1.6.0_27\bin

PATH <---有时这个PATH会填满太多路径,您就无法添加路径(这也是我的情况!)

bunchofpaths;C:\Program Files (x86)\Java\jdk1.6.0_27\bin

此外,当您尝试使用 cmd 执行文件时,请确保您在与要执行的文件相同的本地目录中(您已经做到了这点)。

这只是一个小清单,适用于仍然遇到此问题的人们。


3
我猜你在 p1.java 中有一个不同的类名。

@Lakshmi:你的main()方法的类名是什么? - Prince John Wesley

2

我遇到过类似的问题。如果你使用Eclipse,你需要进入包含src/文件夹的文件夹...如果你使用了一个包 - 你需要使用

javac -cp . packageName/className

这意味着如果你有一个名为 def 的包和一个名为 TextFrame.java 的主类,你需要写:
javac -cp . def/TextFrame

省略掉结尾的".java"扩展名,然后使用相应工具运行即可。
java def/TextFrame 

如果您有参数,那么您需要提供与程序相应的参数。希望这能对您有所帮助。


我不确定我做错了什么。我有一个简单命名为package awc;的包,然后我可以编译它而没有错误。但是当我运行这个程序时,我得到了OP所说的错误。我需要做些其他的事情才能让你的命令工作吗?我进入了目录,并尝试发出awc.JavaProgram.cass。 - FilBot3

1
您可能已经添加了CLASSPATH环境变量!
使用以下方法避免在java -cp . CLASSFILE中进一步使用-cp。
通过系统属性->环境变量或cmd将.添加到CLASSPATH中。
set CLASSPATH=%CLASSPATH%;.;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接