不要小看 HelloWorld,这些坑能让新手卡一下午。
别觉得 HelloWorld 简单到不值一提。我带过的实习生里,至少有一半在第一天就卡在了"跑不起来"上。不是代码写错了,就是环境配错了,或者被一些"看起来对但其实错"的操作坑了。
今天把 HelloWorld 阶段最常见的 8 个坑整理出来,每个坑我都真实遇到过。
陷阱 1:下了 JRE,没下 JDK
这是新手最高频的第一个坑。Oracle 官网页面上 JDK 和 JRE 挨着放,很多人下错了。
症状:装完 Java,java -version 能跑,但 javac 提示找不到命令。
原理:JRE(Java Runtime Environment)只有运行时环境,不带编译器 javac。JDK(Java Development Kit)才包含编译器、调试器等开发工具。JRE 是 JDK 的子集。
# 验证你装的是不是 JDK
javac -version
# 如果输出 javac 17.0.x → 你装的是 JDK ✅
# 如果提示 command not found → 你装的是 JRE ❌
解决:去 Oracle 官网 或用包管理器(brew install openjdk)装 JDK。
陷阱 2:记事本默认加了 .txt 后缀
Windows 记事本有个"贴心"的默认行为:保存文件时自动追加 .txt。你以为保存的是 HelloWorld.java,实际文件名是 HelloWorld.java.txt。
症状:javac HelloWorld.java 提示文件不存在。用 dir 一看,文件名多了 .txt。
解决方案有三:
方案 1:保存时文件名加英文双引号 → "HelloWorld.java"
方案 2:保存类型选「所有文件 (*.*)」
方案 3:别用记事本,换 VS Code / Notepad++
这个坑虽然低级,但我见过不止十个人栽在这里,包括一个三年经验的后端(他换了台新电脑)。
陷阱 3:javac 和 java 的参数搞反
这是概念混淆导致的经典错误:
# ✅ 正确
javac HelloWorld.java # 编译:参数是【文件名】,带 .java
java HelloWorld # 运行:参数是【类名】,不带任何后缀
# ❌ 错误
javac HelloWorld # 报错:Class names are only accepted if...
java HelloWorld.class # 报错:Could not find or load main class HelloWorld.class
java HelloWorld.java # JDK 11 以下报错;JDK 11+ 是单文件模式,不生成 .class
记忆口诀:javac 吃文件,java 吃类名。
陷阱 4:PATH 没配,javac 找不到
症状:'javac' is not recognized as an internal or external command(Windows)或 javac: command not found(Linux/Mac)。
这说明操作系统不知道 javac 在哪儿。你的 JDK 安装了,但系统的 PATH 环境变量里没有 JDK 的 bin 目录。
Windows 解决:
1. 右键「此电脑」→ 属性 → 高级系统设置 → 环境变量
2. 系统变量 → 找到 Path → 编辑
3. 新建一行:C:\Program Files\Java\jdk-17\bin (替换为你的实际路径)
4. 确定 → 重新打开 cmd(必须重开,旧窗口不会生效)
Linux / macOS 解决:
export PATH=$PATH:/path/to/jdk/bin
# 写入 ~/.bashrc 或 ~/.zshrc 永久生效
临时方案(不想配 PATH):用全路径调用。
/usr/local/jdk-17/bin/javac HelloWorld.java
陷阱 5:大小写不一致
Java 是大小写敏感的。HelloWorld 和 helloworld 是两个完全不同的东西。
常见翻车场景:
// 文件名: helloworld.java
public class HelloWorld { // 编译报错!类名和文件名大小写不一致
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
更隐蔽的坑:
// System 写成 system → 编译报错
system.out.println("Hello"); // ❌ 找不到 system
// String 写成 string → 编译报错
public static void main(string[] args) // ❌ 找不到 string 类型
规则:Java 里类名首字母大写(System、String、HelloWorld),关键字全小写(public、static、void)。一个字母都不能错。
陷阱 6:中文标点混入代码
这个坑在中文环境下极其常见。肉眼几乎看不出区别:
// ❌ 用了中文分号(;)和中文引号("")
System.out.println("Hello World!");
// ✅ 正确:全部使用英文标点
System.out.println("Hello World!");
常见混入位置:分号 ; vs ;、括号 () vs ()、引号 "" vs ""、逗号 , vs ,。
解决:编码时切换到英文输入法。如果你用中文输入法写注释后忘了切回来,代码里的标点可能就是中文的。很多 IDE(IntelliJ IDEA)会用波浪线提示非法字符,注意观察。
陷阱 7:CLASSPATH 污染
有些老教程让你设置 CLASSPATH 环境变量。如果你设了一个错误的 CLASSPATH,java 命令就不会在当前目录找 .class 文件了。
症状:明明 .class 文件就在当前目录,但 java HelloWorld 还是报 NoClassDefFoundError。
解决:
# 方案 1:显式指定当前目录为类路径
java -cp . HelloWorld
# 方案 2:清除 CLASSPATH
# Windows
set CLASSPATH=
# Linux / macOS
unset CLASSPATH
最佳实践:不要设置全局 CLASSPATH 环境变量。现代 Java 开发用 Maven/Gradle 管理依赖,CLASSPATH 这种上古做法已经过时了。
陷阱 8:一个语法错误引发雪崩式报错
新手看到编译器一次性输出 20 条错误信息,往往直接懵了。
真相:很多时候只有第一个错误是真正的错误,后面的都是"连锁反应"。比如你第 5 行漏了一个分号,编译器从第 5 行开始就"理解不了"你的代码了,后面的每一行它都觉得有问题。
HelloWorld.java:5: error: ';' expected
System.out.println("Hello World!")
^
HelloWorld.java:6: error: illegal start of expression
}
^
HelloWorld.java:7: error: reached end of file while parsing
}
^
3 errors
解决原则:永远只看第一个错误,修完重新编译。很多时候第一个错修了,后面的全部消失。
快速排查流程
遇到问题按这个顺序排查:
程序跑不起来
├── javac 报错?
│ ├── command not found → 配 PATH(陷阱 4)
│ ├── file not found → 检查文件名和后缀(陷阱 2、3)
│ ├── 语法错误 → 修第一个错误重新编译(陷阱 8)
│ └── 类名和文件名不匹配 → 统一大小写(陷阱 5)
│
└── java 报错?
├── NoClassDefFoundError → 检查目录 + CLASSPATH(陷阱 7)
├── Could not find main class X.class → 去掉 .class 后缀(陷阱 3)
└── NoSuchMethodError: main → 检查 main 方法签名
写在最后
HelloWorld 虽小,它覆盖了 Java 开发的完整链路:编写 → 编译 → 运行。把这条链路跑通跑顺,你后面学什么都有底气。
如果你在踩坑过程中发现了本文没覆盖的新坑,欢迎评论区分享。
完整演示代码 + 速查手册 → 公众号「IT探险家」回复「HelloWorld」
面试深度解析 → 知识星球「IT探险家·进阶圈」