現象描述
在 A、B 兩個目錄下分別編寫 Test.java 與 test.java,編譯均成功。但運行時:A 目錄下 java Test 正常;B 目錄下 java test 提示「找不到主類 test」。刪除 A 目錄下的 Test.java 和 Test.class 後,B 目錄下 java test 又能正常運行。兩個目錄看似獨立,為何會相互干擾?
根因剖析
關鍵在於 classpath 包含當前目錄 (.) 以及 類名與文件名不一致:
- test.java 中定義的類名可能不是 test(如 class Demo),且非 public。
- 編譯時 javac test.java 產生 Demo.class,但運行 java test 會嘗試加載名為 test 的類,失敗。
- 當 A 目錄存在 Test.class 時,classpath 掃描順序導致類加載器錯誤綁定,刪除後恢復正常。
解決方案
- 確保 文件名與 public 類名完全一致(大小写敏感)。
- 若類非 public,文件名可不同,但運行時需使用 完整類名(如 java Demo)。
- 規範項目結構:使用包名、建議用 IDE 管理編譯輸出目錄,避免源碼與 class 混雜。
最佳實踐
始終遵循「一個 public 類對應一個同名 .java 文件」,並在包結構下組織代碼,徹底杜絕此類路徑干擾問題。