首先确认HelloWorld.class是否真实生成,执行ls -l .class(Linux/macOS)或dir .class(Windows);若无输出,说明javac未成功运行,需检查.java后缀、文件名与public类名是否严格一致(大小写敏感)、有无语法错误及package声明与目录结构是否匹配。

确认.class文件是否真实生成
报这个错,第一反应不该是改环境变量,而是先看HelloWorld.class有没有真的存在。JVM找不到主类,最常见原因是它压根没看见那个文件。
进你的源码目录,执行:ls -l *.class(Linux/macOS)或dir *.class(Windows)
如果输出为空,说明javac根本没成功运行。重点检查:
- 是否漏了.java后缀:输成javac HelloWorld会静默失败,必须写javac HelloWorld.java
- 文件名和public class声明是否完全一致(大小写敏感):比如文件叫helloworld.java,但类声明是public class HelloWorld,编译直接失败,且不提示原因
- 是否有语法错误导致编译中断(如缺少;、括号不匹配),此时也不会生成.class
包声明(package)和目录结构必须严格咬合
一旦代码顶部写了package com.example;,JVM就不再在当前目录找HelloWorld.class,而是在com/example/HelloWorld.class路径下找。
两种可靠做法:
- 编译时用javac -d . HelloWorld.java:自动按package建目录并放好.class,推荐首选
- 手动建目录:mkdir -p com/example → mv HelloWorld.class com/example/,再从com的父目录运行java com.example.HelloWorld
注意:
- 运行时必须用全限定类名,比如com.example.HelloWorld,不能只写HelloWorld
- javac -d .中的.代表当前目录,不是占位符,别写成javac -d ./src之类
强制指定类路径(-cp)绕过CLASSPATH干扰
系统级CLASSPATH经常偷偷覆盖你的意图。临时屏蔽它,用-cp显式告诉JVM去哪找:
无包情况:java -cp . HelloWorld
有包情况:java -cp . com.example.HelloWorld
验证是否被全局CLASSPATH拖累:
- Linux/macOS:echo $CLASSPATH
- Windows:echo %CLASSPATH%
如果输出里有非预期路径(比如老版本JDK的lib目录),极可能干扰查找
IDEA里主类找不到?盯死三个配置点
IDEA报这个错,92%不是代码问题,而是配置断层:
Project Structure → Project → Project compiler output必须指向有效目录(如out/production/myproject),且该目录下真有.class文件Project Structure → Modules → Sources中,src/main/java必须标记为Sources(蓝色图标)Run Configuration → Use classpath of module必须选对模块,不能是none;Maven项目还要勾选Delegate IDE build to Maven,否则IDEA跳过maven-compiler-plugin规则,源码不进编译路径
最容易被忽略的是:修改过module输出路径后,没同步更新Run Configuration里的模块选择——JVM按旧路径找,自然扑空


















