首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 異常處理與拋出機制全解析:try-catch-finally 與 throws 實戰

     編輯:Java 相關知識

異常是程序運行過程中違背預期的事件。Java 通過異常處理機制,將錯誤檢測、傳播、處理分離,保證程序健壯性。本文系統梳理異常捕獲、拋出、自定義異常的核心語法與最佳實踐。

異常處理基礎語法

try {
    // 可能拋出異常的代碼
} catch (ExceptionType e) {
    // 異常處理邏輯
} finally {
    // 無論是否異常必執行的清理代碼(關流、釋放資源)
}

關鍵特性

  • try:包裹風險代碼,發生異常後續語句不再執行,直接跳轉 catch
  • catch:按異常類型匹配,可多塊捕獲不同異常,子類異常需置於父類前
  • finally:保證執行,即使 catch 中 return/throw 也會先執行 finally(極少數 JVM 退出除外)

實戰示例:用戶輸入驗證

public static void main(String[] args) {
    int divisor = 0;
    double result = 0;
    try {
        System.out.println("請輸入非零數字:");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        divisor = Integer.parseInt(input);  // 可能拋 NumberFormatException
        result = 100 / divisor;             // 可能拋 ArithmeticException
        System.out.println("結果:" + result);
    } catch (Exception e) {
        System.out.println("輸入錯誤:" + e.getMessage());
    }
}

輸入 "abc" 觸發 NumberFormatException,輸入 "0" 觸發 ArithmeticException,統一由 catch 捕獲處理。

異常拋出:throws 與 throw

1. throws —— 方法簽名聲明

聲明方法可能拋出的受檢異常,強制調用者處理:

public static double divide() throws Exception {
    Scanner sc = new Scanner(System.in);
    String input = sc.nextLine();
    int num = Integer.parseInt(input);
    return 100 / num;
}

// 調用處必須 try-catch 或繼續 throws
public static void main(String[] args) {
    try {
        System.out.println(divide());
    } catch (Exception e) {
        System.out.println("計算失敗");
    }
}

2. throw —— 顯式拋出異常對象

在代碼邏輯中主動拋出特定異常:

if (input.equals("abc")) {
    throw new NumberFormatException("禁止輸入 abc");
}

throws vs throw 對比

維度throwsthrow
位置方法聲明處方法體內部
含義聲明可能拋出的異常類型實際拋出異常對象
執行不一定發生執行即拋出
處理責任推給調用者當前方法或調用者

自定義異常:業務語義化錯誤

四步驟

  1. 創建異常類繼承 Exception(受檢)或 RuntimeException(非受檢)
  2. 提供構造方法傳遞錯誤信息
  3. 在業務方法中 throw 拋出
  4. 調用處 catch 處理或繼續 throws
// 1. 自定義異常
class DivideByZeroException extends Exception {
    public DivideByZeroException(String msg) { super(msg); }
}

// 2. 業務方法拋出
class Calculator {
    public int div(int a, int b) throws DivideByZeroException {
        if (b == 0) throw new DivideByZeroException("除數不能為零");
        return a / b;
    }
}

// 3. 調用處理
public static void main(String[] args) {
    try {
        System.out.println(new Calculator().div(10, 0));
    } catch (DivideByZeroException e) {
        System.err.println(e.getMessage()); // 除數不能為零
        e.printStackTrace();
    }
}

最佳實踐原則

  1. 盡早捕獲、妥善處理:catch 塊不可空,至少記錄日誌
  2. 資源關閉放 finally:流、連接、鎖必須在 finally 中釋放
  3. 拋出異常聲明 throws:方法內 throw 後建議聲明 throws,語義清晰
  4. 區分受檢/非受檢:可預期可恢復用受檢,編程錯誤用非受檢
  5. 避免吞沒異常:catch 後不處理直接 return 會掩蓋真實問題

異常機制非單純錯誤處理,更是控制流的一種表達方式。善用它,讓錯誤路徑如主流程般清晰可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved