Java&#34;无法找到或加载主类<class name =“”>

时间:2016-10-12 13:18:55

标签: java windows netbeans

我在学校里有很多java课程。 9月初,我将笔记本电脑重新格式化为Windows 10(之前也是Windows 10)。

  • 重新格式化之前:一切都运行得很好
  • 重新格式化之后:我安装了jdk 8u101 x64和NetBeans 8.2。(我以前也使用过Netbeans和jdk的旧版本,如果我没错的话)。

我打开了我在学校实验室写的项目,当我按下构建并运行它时,它给了我错误:

Could not find or load main class <Class Name>

我试图创建一个新项目,只是为了看看我从学校拿来的代码是否有问题,但我遇到了同样的问题。你能帮我解决一下这个问题吗?

1 个答案:

答案 0 :(得分:0)

java命令语法

首先,您需要了解使用java(或javaw)命令启动程序的正确方法。

正常的syntax1是这样的:

java [ <option> ... ] <class-name> [<argument> ...]

其中是命令行选项(以&#34; - &#34;字符开头),是一个完全限定的Java类名,是一个传递给应用程序的任意命令行参数。 1 - &#34;可执行文件&#34;的第二种语法。我将在底部描述的JAR文件。

完全限定的类名通常按Java源代码编写; e.g。

packagename.packagename2.packagename3.ClassName

然而,某些版本的java命令允许您使用斜杠而不是句点; e.g。

packagename/packagename2/packagename3/ClassName

(令人困惑)看起来像文件路径名,但不是一个。请注意,术语完全限定的类名是标准的Java术语...而不是我只是让你迷惑的东西: - )

以下是java命令的示例:

java -Xmx100m com.acme.example.ListUsers fred joe bert

以上将导致java命令执行以下操作:

搜索com.acme.example.ListUsers类的编译版本。 加载课程。 检查该类是否具有签名+修饰符的main方法public static void main(String [])。 调用该方法将命令行参数(&#34; fred&#34;,&#34; joe&#34;,&#34; bert&#34;)作为String []传递给它。 Java无法找到类的原因

当您收到消息&#34;无法找到或加载主类...&#34;时,表示第一步失败。 java命令无法找到该类。事实上,&#34; ...&#34;在消息中将是java正在寻找的完全限定的类名。

那么为什么它找不到这个班级呢?基本上,有两个主要原因:

第一个可能的原因是您可能提供了错误的类名。 (或者......正确的类名,但形式错误。)考虑到上面的例子,这里有各种错误的方法来指定类名:

示例#1 - 一个简单的类名:

java ListUser 当在com.acme.example这样的包中声明类时,必须在java命令中使用包含包名的完整类名;例如 java com.acme.example.ListUser 示例#2 - 文件名或路径名而不是类名: java ListUser.class java com / acme / example / ListUser.class 示例#3 - 包含错误的类名称: java com.acme.example.listuser 例#4 - 拼写错误 java com.acme.example.mistuser 第二个可能的原因是类名是正确的,但java命令找不到类。要理解这一点,您需要了解&#34; classpath&#34;的概念。 Oracle文档很好地解释了这一点:

java命令文档 设置类路径。 Java教程 - PATH和CLASSPATH 所以......如果你正确地指定了类名,接下来要检查的是你已经正确指定了类路径:

阅读上面链接的三个文件。 (是......阅读它们。重要的是,Java程序员至少要了解Java类路径机制的工作原理。) 查看运行java命令时生效的命令行和/或CLASSPATH环境变量。检查目录名称和JAR文件名是否正确。 如果类路径中有相对路径名,请检查它们是否正确解析...从运行java命令时生效的当前目录。 检查类(在错误消息中提到)是否可以位于有效的类路径上。 附加说明:

当您在类路径上放置目录时,它在概念上对应于限定名称空间的根目录。通过将完全限定名称映射到路径名,类位于该根下的目录结构中。例如,如果&#34; / usr / local / acme / classes&#34;在类路径上,然后当JVM查找名为com.acme.example.Foon的类时,它将查找&#34; .class&#34;文件名为:

/usr/local/acme/classes/com/acme/example/Foon.class

如果你放了&#34; / usr / local / acme / classes / com / acme / example&#34;在类路径上,然后JVM将无法找到该类。 类路径需要包含应用程序所依赖的所有其他(非系统)类。 (系统类是自动定位的,你很少需要关注它。) java -jar语法

用于&#34;可执行文件&#34;的替代语法JAR文件如下:

java [ <option> ... ] -jar <jar-file-name> [<argument> ...]

e.g。

java -Xmx100m -jar /usr/local/acme-example/listuser.jar fred

在这种情况下,入口点类的名称(即com.acme.example.ListUser)和类路径在JAR文件的MANIFEST中指定。

的IDE

典型的Java IDE支持在IDE JVM本身或子JVM中运行Java应用程序。这些通常不受此特殊异常的影响,因为IDE使用自己的机制来构造运行时类路径,标识主类并创建java命令行。

但是,如果您在IDE后面执行操作以破坏事物,则仍可能发生此异常。例如,如果您之前在Eclipse中为Java应用程序设置了应用程序启动器,那么您移动了包含&#34; main&#34;的JAR文件。在没有告诉Eclipse的情况下将类放到文件系统中的不同位置,Eclipse将无意中使用不正确的类路径启动JVM。

简而言之,如果您在IDE中遇到此问题,请检查旧的IDE状态,损坏的项目引用或损坏的启动器配置等内容。