現象
Debug 顯示程序卡在 `String line = rd.readLine();`,無法繼續執行,`java.util` 包似乎未被使用,主類也未運行。
根因分析
IO 阻塞:`readLine()` 會一直等待直到讀到換行符、EOF 或發生異常。常見原因:
- 文件路徑錯誤:`FileReader` 構造沒有拋出異常(文件存在),但路徑指向一個**命名管道、設備文件或網絡掛載點**,數據源不產生換行符。
- 流未正確關閉/刷新:寫入端未 `flush()` 或 `close()`,導致讀取端看不到 EOF。
- 異常被吞沒:`catch (IOException e)` 中只有 `throw new ErrorException(e);`,若 `ErrorException` 未被捕獲,線程終止但調試器顯示停在 `readLine()` 內部。
排查步驟
- 在 `catch` 塊和 `throw` 行打斷點,確認是否拋出異常。
- 簡化代碼測試:硬編碼已知存在的文本文件路徑,驗證讀取邏輯本身無誤。
- 檢查 `DICTIONARY_FILE` 常量定義的路徑是否為絕對路徑,工作目錄是否正確。
- 使用 `Files.lines(Path)` (Java 8+) 替代手動 `BufferedReader`,自動處理資源關閉。
簡化測試代碼
Path path = Paths.get("D:/data/dict.txt"); // 確定存在的文件
try (Stream<String> lines = Files.lines(path)) {
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
若簡化版正常,說明業務邏輯中的路徑或文件源有問題。