答案是java命令要求输入类名而非文件名,Hello.class会被JVM误解析为名为“Hello”的子包下的“class”类;正确写法是java Hello,且需确保Hello.class位于类路径下、类名与文件名大小写一致、main方法签名正确。

直接用 java 命令运行,但必须满足三个硬性条件:类名拼写完全正确、类路径(-cp 或默认)能定位到 .class 文件、主方法签名和修饰符符合 JVM 规范。
为什么 java Hello.class 会报错 “Error: Could not find or load main class Hello.class”
因为 java 命令不接受带 .class 后缀的文件名——它要的是**类名(fully qualified class name)**,不是文件路径。JVM 会根据类名去类路径中查找对应包结构下的 .class 文件。
- 错误写法:
java Hello.class→ 报错,JVM 尝试加载名为Hello.class的类(注意点号被当包分隔符) - 正确写法:
java Hello→ JVM 在当前目录(默认类路径)下找Hello.class - 若类在包中(如
package com.example;),则必须确保Hello.class在com/example/Hello.class目录结构下,并用java com.example.Hello运行
java 命令找不到类的常见原因和检查点
即使写了正确的类名,仍可能报 NoClassDefFoundError 或 ClassNotFoundException,核心是类路径没对上。
- 默认类路径只包含当前目录(
.),如果.class在out/目录下,得显式加-cp out:java -cp out Hello - 多个依赖
.class或.jar时,用:(macOS/Linux)或;(Windows)分隔:java -cp "out:lib/utils.jar" com.example.Main - 使用
-verbose:class可看到 JVM 实际加载了哪些类、从哪加载的,方便定位缺失或错位:
java -verbose:class -cp out com.example.Main
模块化项目(Java 9+)不能用 -cp 启动
一旦项目含 module-info.java,JVM 就进入模块模式,此时 -cp 被忽略,必须用 --module-path 和 --module。
- 编译时用了
--module-source-path,输出到out/,那么运行必须写:java --module-path out -m com.example.main/com.example.main.Main -
-m后格式严格为<module-name>/<main-class-fullname>,中间是斜杠,不是点;module-name来自module-info.java中的module xxx { } - 如果主模块
requires com.example.util,那com.example.util的编译输出也必须出现在--module-path中,否则启动失败
最容易被忽略的是:模块化项目里,哪怕你把所有 .class 都扔进一个目录,只要没用 --module-path 启动,JVM 就不会识别 module-info.class,整个模块系统形同虚设——类全掉进“未命名模块”,requires 检查失效,跨模块访问直接失败。


















