讀者反映《瘋狂 Java 講義》書中 Lambda 範例在 Eclipse/MyEclipse 中報錯,但 `cmd` 下 `javac`/`java` 卻能正常運行。這是典型的 **IDE 內建編譯器/JRE 版本與專案設定不一致** 導致。以下系統排查與修正步驟。
| IDE 報錯 | 可能原因 |
|---|---|
| `Lambda expressions are allowed only at source level 1.8 or above` | 專案編譯器合規性設為 1.7 或更低 |
| `Target typing context` / `Incompatible functional interface` | JDK 版本過舊(< 8)或函數式介面簽名不匹配 |
| `Cannot resolve symbol 'stream'` / `Optional` | 專案未引用 JDK 8+ 類庫(rt.jar) |
| 運行時 `UnsupportedClassVersionError` | 編譯用 JDK 11+,運行用 JRE 8 |
1. 安裝的 JDK 版本 (javac -version)
2. 專案編譯器合規性 (Project → Properties → Java Compiler → Compiler compliance level)
3. 運行環境 JRE (Run Configurations → JRE → Alternate JRE)
書中 Lambda 需要 **JDK 8+**。若三者不一致,IDE 編譯報錯但命令列正常(命令列直接用系統 PATH 指向的 JDK)。
<!-- pom.xml 強制指定編譯版本 -->
1.8
1.8
UTF-8
org.apache.maven.plugins
maven-compiler-plugin
3.11.0
1.8
1.8
UTF-8
執行 `mvn clean compile` 驗證命令列編譯無錯,再 `Maven → Reload Project` 同步到 IDE。
`javac` 直接讀取系統 `JAVA_HOME` 指向的 JDK(通常是最新安裝的 8+),而 IDE 可能仍指向舊版 JRE 或專案合規性鎖在 1.7。命令列繞過了 IDE 的配置層。
@echo off
echo === 系統 JAVA_HOME ===
echo %JAVA_HOME%
echo.
echo === javac 版本 ===
javac -version
echo.
echo === java 版本 ===
java -version
echo.
echo === 編譯測試 Lambda ===
echo "public class Test { public static void main(String[] args) { Runnable r = () -> System.out.println(\"Lambda OK\"); r.run(); } }" > Test.java
javac Test.java && java Test
del Test.java Test.class
pause
保存為 `check_java_env.bat` 雙擊運行,輸出若顯示 `Lambda OK` 則環境無問題,錯在 IDE 配置。
完成上述步驟,書中所有 Lambda/Stream/Optional 範例即可在 IDE 中正常編譯運行。