问题

新Java开发人员遇到的一个常见问题是,他们的程序无法运行,并显示错误消息:“无法找到或加载主类......”

这是什么意思,是什么导致它,你应该如何解决它?

#1 热门回答(839 赞)

java 命令语法

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

正常的语法是这样的:

java [ ... ] [ ...]

其中是一个命令行选项(以“ - ”开始),是一个完全限定的Java类名,是一个任意的命令行参数,传递给你的应用程序。

1 - “可执行”JAR文件有第二种语法,我将在底部描述。

该类的完全限定名称(FQN)通常按照您在Java源代码中的方式编写;例如

packagename.packagename2.packagename3.ClassName

但是,java命令的某些版本允许您使用斜杠而不是句点;例如

packagename/packagename2/packagename3/ClassName

其中(令人困惑)看起来像文件路径名,但不是一个。请注意,有条件限定的名称是标准的Java术语...不是我刚刚让你迷惑的东西:-)

下面是一个java命令的例子:

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

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

搜索com.acme.example.ListUsers类的编译版本。

加载课程。

检查类是否具有带有签名,返回类型和main static void main(String [])给出的修饰符的main方法。 (请注意,方法参数的名称不是签名的一部分。)

调用该方法将命令行参数(“fred”,“joe”,“bert”)作为String []传递给它。

Java找不到类的原因

当您收到消息“无法找到或加载主类...”时,表示第一步失败。 java命令无法找到该类。事实上,消息中的“...”将是'java'正在寻找的合格类名。

那么为什么它无法找到课堂?

##原因#1 - 你在classname参数上犯了一个错误

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

示例#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

示例#5 - 源文件名java ListUser.java

例6 - 你完全忘记了类的名字java很多参数

##原因#2 - 应用程序的类路径被错误地指定

第二个可能的原因是类名是正确的,但是java命令找不到该类。要理解这一点,你需要理解“classpath”的概念。 Oracle文档解释了这一点:

java命令文档

设置类路径。

Java教程 - PATH和CLASSPATH

所以......如果你正确地指定了类名,接下来要检查的是你已经正确地指定了classpath:

阅读上面链接的三个文件。 (是的......阅读它们。重要的是,Java程序员至少要了解Java类路径机制的工作原理。)

查看命令行和/或运行java命令时有效的CLASSPATH环境变量。检查目录名称和JAR文件名是否正确。

如果类路径中存在相对路径名,请检查它们是否正确解析...从运行java命令时生效的当前目录。

检查类(错误消息中提到的)是否可以位于有效的类路径中。

请注意,Windows与Linux和Mac OS的类路径语法不同。

##原因#2a - 错误的目录位于类路径中

当你把一个目录放在类路径上时,它在概念上与合格名称空间的根对应。通过将完全限定名称映射到路径名,类位于该根下的目录结构中。例如,如果类路径中有“/ usr / local / acme / classes”,那么当JVM寻找名为com.acme.example.Foon的类时,它将查找“.class”文件使用此路径名:

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

如果在类路径中放置了“/ usr / local / acme / classes / com / acme / example”,则JVM将无法找到该类。

Reason#2b - 子目录路径与FQN不匹配

如果您的类FQN是com.acme.example.Foon,那么JVM将在目录“com / acme / example”中查找“Foon.class”:

如果您的目录结构与上面的模式的包命名不匹配,则JVM将找不到您的类。

如果您尝试通过移动类来重命名类,那么也会失败......但异常堆栈跟踪将会失败不同。

举一个具体的例子,假设:

你想运行com.acme.example.Foon类,

完整的文件路径是/usr/local/acme/classes/com/acme/example/Foon.class,

你当前的工作目录是/ usr / local / acme / classes / com / acme / example /,

然后:

# wrong, FQN is needed

java Foon

# wrong, there is no `com/acme/example` folder in the current working directory

java com.acme.example.Foon

# wrong, similar to above

java -classpath . com.acme.example.Foon

# fine; relative classpath set

java -classpath ../../.. com.acme.example.Foon

# fine; absolute classpath set

java -classpath /usr/local/acme/classes com.acme.example.Foon

笔记:

在大多数Java版本中,-classpath选项可以缩短为-cp。检查java,javac等各自的手册条目。

在类路径中选择绝对路径名和相对路径名时要仔细考虑。请记住,如果当前目录发生更改,相对路径名可能会“中断”。

Reason#2c - 类路径中缺少依赖项

类路径需要包含应用程序所依赖的所有其他(非系统)类。 (系统类自动定位,并且您很少需要关注这一点。)要正确加载主类,JVM需要查找:

课堂本身。

超类层次结构中的所有类和接口(例如,请参阅Java类存在于类路径中,但启动失败,错误:无法找到或加载主类)

通过变量或变量声明或方法调用或字段访问表达式引用的所有类和接口。

(注意:JLS和JVM规范允许JVM的某些范围“懒惰地”加载类,这可能会影响何时抛出类加载器异常。)

##原因#3 - 该类已被声明在错误的包中

偶尔会有人将源代码文件放入其源代码树中的错误文件夹中,或者他们忽略了package声明。如果您在IDE中执行此操作,IDE的编译器会立即告诉您这一点。同样,如果你使用一个体面的Java构建工具,该工具将以检测问题的方式运行javac。但是,如果您手动构建Java代码,则可以这样做,即编译器不会注意到问题,并且生成的“.class”文件不在您期望的位置。

java -jar 语法

用于“可执行”JAR文件的替代语法如下所示:

java [ ... ] -jar [ ...]

例如

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

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

IDEs

典型的Java IDE支持在IDE JVM本身或子JVM中运行Java应用程序。由于IDE使用自己的机制来构造运行时类路径,识别主类并创建java命令行,所以这些通常会从这种特殊的异常中解脱出来。

但是,如果您在IDE后面执行操作,则仍可能发生此异常。例如,如果您以前在Eclipse中为您的Java应用程序设置了应用程序启动器,然后您将包含“main”类的JAR文件移至文件系统中的其他位置而不告知Eclipse,则Eclipse会无意中启动JVM一个不正确的类路径。

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

IDE也可能简单地混淆。 IDE是非常复杂的软件,由许多相互作用的部分组成。其中许多部分采用了各种缓存策略,以使IDE作为一个整体响应。这些有时可能会出错,一种可能的症状是启动应用程序时出现问题。如果您怀疑可能发生这种情况,则值得重新启动IDE。

##其他参考

从Oracle Java教程 - 常见问题(及其解决方案)

#2 热门回答(180 赞)

如果您的源代码名称是HelloWorld.java,那么您的编译代码将是HelloWorld.class。

如果您使用以下方法调用它,您将收到该错误:

java HelloWorld.class

相反,使用这个:

java HelloWorld

#3 热门回答(93 赞)

如果你的类在包中,那么你必须cd到主目录并使用类的全名(packageName.MainClassName)运行。

例:

我的课程在这里:

D:\project\com\cse\

我的主类的全名是:

com.cse.Main

所以我cd回到主目录:

D:\project

然后发出java命令:

java com.cse.Main

找不到java是什么意思_“无法找到或加载主类”是什么意思?相关推荐

  1. java 找不到或无法加载类_解决Java中找不到或无法加载主类错误

    场景: 使用java命令运行.class文件时出现:"错误: 找不到或无法加载主类": 原因: 1.java指令默认在寻找class文件的地址是通过CLASSPATH环境变量中指定 ...

  2. java version找不到_配置环境变量时,cmd下运行java -version,报错:找不到或无法加载主类 -version...

    这个方面适用于报错为:java 找不到或无法加载主类,一般是找不到类的路径,问题出在CLASSPATH环境变量上,当然这是大多数.大概率的出错点 不排除根据个人情况不况,所以想起来伟大领袖毛主席的话: ...

  3. JAVA:错误: 编码GBK的不可映射字符;错误: 找不到或无法加载主类;

    目录 一.编码GBK的不可映射字符: 1.现象 2.解决方法 ANSI:ANSI是什么编码? - malecrab - 博客园 (cnblogs.com) 二.找不到或无法加载主类 一.编码GBK的不 ...

  4. java报错-找不到或无法加载主类(Error: Could not find or load main class)

    此文首发于我的个人博客:java报错-找不到或无法加载主类(Error Could not find or load main class) - zhang0peter的个人博客 比如说test.ja ...

  5. java问题:错误: 找不到或无法加载主类 HelloWorld

    有时候我们需要直接用jdk提供的java命令来执行class文件让软件运行起来,特别是很多初学者,但经常会发现如下提示: D:\java\eclipse-workspace\first\src\fir ...

  6. java 找不到或无法加载主类- 解决方案

    java 找不到或无法加载主类- 解决方案 参考文章: (1)java 找不到或无法加载主类- 解决方案 (2)https://www.cnblogs.com/caibixiang123/p/1170 ...

  7. 命令行下运行 java someClass.class出现 “错误:找不到或无法加载主类someClass ” 的解决方案

    命令行下运行 java someClass.class出现 "错误:找不到或无法加载主类someClass " 的解决方案 参考文章: (1)命令行下运行 java someCla ...

  8. java环境变量详解---找不到或无法加载主类

    刚学java,配置好环境变量之后,在DOS下却运行java小程序却始终出现"找不到或无法加载主类"然后返回配置环境变量折腾了好久,查看书籍.网上的资料,最终OK了!安装Eclips ...

  9. 在命令窗口执行java文件时,提示找不到或无法加载主类

    在命令窗口执行java文件时,提示找不到或无法加载主类 以前写java代码的时候,都是在Eclipse或者IDEA等集成开发工具上进行,所以编译和测试代码的时候都是一键执行,其中的原理简单来说,就是先 ...

  10. Java 错误: 找不到或无法加载主类,问题集合

      正确编译命令: javac Hello.java 正确运行命令: java Hello 错误1:H:\code>java Hello.java 错误: 找不到或无法加载主类 Hello.ja ...

最新文章

  1. java十四章带参方法课后_java14带参的方法
  2. 老板:kill -9 的原理都不知道就敢去线上执行?明天不用来了
  3. [转]详细介绍java中的数据结构
  4. Android系统的开机画面显示过程分析(8)
  5. Maven精选系列--POM文件解析
  6. 代码规范 设计模式落地之路
  7. python 生成pdf页面大小_使用具有自定义大小页面和最佳图像分辨率的Reportlab生成PDF...
  8. 七夕来临!来支付宝“结个婚”吧 全国5个省市可用
  9. java design pattern
  10. Java比较两个实体属性值是否相同,将不同的属性输出
  11. 分析及解决SQLServer死锁问题
  12. 2021年四川省副高考试成绩查询,2021年四川省教育考试院成绩查询登录入口
  13. Map Reduce学习
  14. [转] 怎么减少编程中的 bug?
  15. 英特尔®以太网700系列的动态设备个性化
  16. C/C++音乐播放(亲测有效)
  17. 微信小程序跳转公众号图文内容
  18. java + jfreechart + itextpdf创建折线图饼图并导出为pdf
  19. Arduino 播放音乐教程
  20. Css之scoped (有作用域的 CSS)

热门文章

  1. 30字的完美个人简历
  2. window10 安装Java11 并可以和Java8进行自由切换
  3. 科学计算机符号大全,计算机符号代码大全
  4. 如果编程语言都是漂亮的小姐姐,你会喜欢哪一个?
  5. win7升级win10时报0x80072F8F - 0x20000错误处理
  6. 问题解决:虚拟机无法复制粘贴文件
  7. dos模拟器即时存档工具_DOS游戏运行模拟器 DOSBox0.72 1.2MB DOS游戏必备
  8. 获取本机内网、外网ip
  9. 配置可访问外网静态IP
  10. 数理统计与数据分析第三版习题 第3章 第33-35题