程序開發過程中難免會遇到各種異常情況,無論是代碼邏輯錯誤、硬體資源不足,還是外部環境異常(如打印機缺紙、網絡中斷),都需要完善的異常處理機制來應對。與 C 語言依賴函數返回值、約定俗成的錯誤碼不同,Java 作為面向對象語言,提供了結構化、物件導向的異常處理體系,使錯誤信息更豐富、處理邏輯更清晰、代碼結構更優雅。
Java 使用特定的異常對象來封裝錯誤狀態。當異常發生時,JVM 會根據預設或程序員的代碼拋出對應的異常對象。這是一種特殊的控制流轉移:當前線程暫停,沿著方法調用棧向上回溯,直到遇到匹配的異常處理器。
異常處理器由 try、catch、finally 組成(其中 finally 為可選):
try {
// 可能拋出異常的監控代碼區塊
} catch (IOException e) {
// 處理 IOException 及其子類異常
} catch (SQLException e) {
// 處理 SQLException 及其子類異常
} finally {
// 無論是否發生異常,必定執行的清理代碼(如關閉資源)
}
執行流程:
try 區塊包含需監控的高風險代碼。catch 區塊(參數類型為異常類或其父類)。finally 區塊保證資源釋放(關閉流、釋放鎖、斷開連接)一定執行,即使 try 或 catch 中有 return。
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String content = sb.toString();
// 業務邏輯處理 content...
} catch (IOException e) {
e.printStackTrace(); // 打印堆棧軌跡,便於診斷
System.out.println("IO 問題:無法讀取文件");
} finally {
if (br != null) {
try { br.close(); } catch (IOException ignored) {}
}
}
所有異常類繼承自 java.lang.Throwable,主要分為兩大派系:

OutOfMemoryError、StackOverflowError),屬於系統級災難,應用層無法也不應嘗試恢復,直接讓程序崩潰退出。NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。這類異常完全可通過代碼修正避免,屬於 Bug 範疇,不應用 try-catch 掩蓋,而應修復邏輯。源於程序與外部環境交互的不確定性:文件損壞導致 IOException、網絡波動導致 MalformedURLException、數據庫故障導致 SQLException 等。這些因素不受程序員控制,但可預期。異常處理機制主要針對此類異常設計預案:重試、降級、告警、用戶友好提示等。
除調用 API 產生異常,開發者也可在業務邏輯中主動拋出:
class Battery {
private double power = 0.0;
// 內部校驗方法,不自行處理,拋給調用者
private void test(double p) throws Exception {
if (p < 0) {
throw new Exception("用電量必須為正數");
}
}
public boolean useBattery(double p) {
try {
test(p); // 可能拋出異常
} catch (Exception e) {
System.out.println("捕獲異常:" + e.getMessage());
p = 0.0;
}
// 後續邏輯...
return true;
}
}
關鍵點:
throw new ExceptionType("信息") 創建並拋出異常對象。throws ExceptionType。main → useBattery → test,每層要么捕獲,要么繼續 throws。通過繼承 Exception(Checked)或 RuntimeException(Unchecked)創建專屬異常類,攜帶更豐富的上下文信息:
class BatteryUsageException extends Exception {
private final double invalidValue;
public BatteryUsageException(String message, double invalidValue) {
super(message);
this.invalidValue = invalidValue;
}
public double getInvalidValue() { return invalidValue; }
}
拋出時:throw new BatteryUsageException("電量異常", -0.5);,捕獲端可獲取具體非法值,便於精準診斷與日誌分析。
catch (Exception e) 過於寬泛,應針對具體異常類型分層處理。try-with-resources 自動關閉實現 AutoCloseable 的資源。throw new ServiceException("業務失敗", e) 保留堆棧鏈。異常處理是雙刃劍:用得好讓系統健壯優雅,濫用則導致代碼混亂、性能下降。大型項目中,應建立統一異常碼體系、全局異常處理器,實現錯誤信息標準化、日誌結構化、監控告警自動化。