Java 從基礎到精通 — 第 7 講
處理異常和資源嘗試失敗
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
文件、網路和輸入值隨時都可能失敗。 Java 的異常和資源管理語法用於傳播故障並關閉任何路徑上的資源。
傳遞異常
public Settings loadSettings(Path path) throws IOException {
String json = Files.readString(path);
return parser.parse(json);
}
如果呼叫者必須決定如何恢復,請勿強制在內部隱藏異常。 新增上下文時,必須保留原始異常作為原因。
try {
settings = loadSettings(path);
} catch (IOException error) {
logger.warn("settings load failed", error);
settings = Settings.defaults();
}
只捕獲可以處理的異常。 如果您捕獲所有異常並且不採取任何措施,即使是實際的錯誤也可以正常進行。
try-with-resources
public List<String> readLines(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
return reader.lines().toList();
}
}
如果您建立一個在括號內實作 AutoCloseable 的對象,則會在區塊末尾呼叫 close。 檔案句柄在正常返迴路徑和異常路徑上都會被清除。
檢查異常和運行時異常
檢查異常揭示了它們是透過方法聲明還是透過 catch 處理。 執行時期異常(例如 IllegalArgumentException)通常用於無效的呼叫約定或程式錯誤。
兩者中的哪一個不一定更好,但標準是呼叫者是否可以恢復的失敗。
完成後替換狀態
Settings loaded = loadSettings(path);
currentSettings = loaded;
如果您完全建立新值並將其輸入到欄位中,即使載入失敗,現有設定也會保留。 異常設計不是要創建大量捕獲,而是要確定在發生故障時如何保留資源和物件狀態。