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

Java 異常處理完整指南:從分類到自訂異常實戰

     編輯:Java 程式設計入門

Java 異常處理完整指南:從分類到自訂異常實戰

異常是程式執行過程中發生的錯誤狀況,但並非所有錯誤皆為異常。例如缺少分號屬於編譯錯誤 (java.lang.Error);以零為除數則拋出算術異常 (java.lang.ArithmeticException)。

異常產生的常見原因

  • 使用者輸入非法資料
  • 嘗試開啟不存在的檔案
  • 網路通訊中斷或 JVM 記憶體溢位

這些異常可能源自使用者錯誤、程式邏輯錯誤或硬體/環境問題。

Java 異常的三大分類

  • 受檢異常: 典型代表為使用者錯誤或不可預見問題(如檔案不存在)。編譯器強制要求處理,無法在編譯時忽略。
  • 執行時異常: 程式設計師可透過邏輯避免的異常(如空指標、陣列越界)。編譯器不強制處理,可在編譯時忽略。
  • 錯誤: 非異常,屬於程式無法控制的嚴重問題(如堆疊溢位 StackOverflowError、JVM 記憶體不足)。通常不捕獲處理,程式無法恢復。

Exception 類別階層架構

所有異常類別繼承自 java.lang.Exception,而 Exception 繼承自 Throwable。Throwable 另一子類為 Error。異常兩大主分支為 IOException 與 RuntimeException。

異常類別繼承圖


Java 內建異常類別速查

常見非受檢異常 (RuntimeException 子類)

異常名稱描述
ArithmeticException算術條件異常,如整數除以零
ArrayIndexOutOfBoundsException非法索引存取陣列
ClassCastException物件強制轉型失敗
IllegalArgumentException傳遞不合法參數給方法
NullPointerException嘗試在需要物件處使用 null
NumberFormatException字串轉數值格式錯誤
IndexOutOfBoundsException索引超出範圍(陣列、字串、向量)
NegativeArraySizeException建立負大小陣列
SecurityException安全管理器偵測到安全違規
StringIndexOutOfBoundsException字串索引超出範圍
UnsupportedOperationException不支援的操作請求

常見受檢異常 (java.lang 包)

異常名稱描述
ClassNotFoundException找不到指定類別
CloneNotSupportedException物件類別未實作 Cloneable 介面
IllegalAccessException拒絕存取類別
InstantiationException嘗試實例化介面或抽象類別
InterruptedException執行緒被中斷
NoSuchFieldException / NoSuchMethodException請求的欄位/方法不存在

Throwable 核心方法

方法說明
getMessage()返回異常詳細訊息
getCause()返回異常原因物件
toString()返回類別名稱 + 訊息
printStackTrace()輸出堆疊追蹤至錯誤流
getStackTrace()返回堆疊追蹤元素陣列
fillInStackTrace()用當前呼叫堆疊重填堆疊追蹤

捕獲異常:try-catch-finally 機制

基本語法

try {
    // 可能拋出異常的程式碼(保護碼)
} catch (ExceptionType1 e1) {
    // 處理 ExceptionType1
} catch (ExceptionType2 e2) {
    // 處理 ExceptionType2
} finally {
    // 無論是否發生異常皆執行(資源清理)

範例:捕獲陣列越界異常

public class ExcepTest {
    public static void main(String[] args) {
        try {
            int[] a = new int[2];
            System.out.println("Access element three: " + a[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown: " + e);
        }
        System.out.println("Out of the block");
    }
}
// 輸出:
// Exception thrown: java.lang.ArrayIndexOutOfBoundsException: 3
// Out of the block

多重 catch 區塊

一個 try 可跟隨多個 catch,依序比對異常型別,匹配即處理,否則傳遞下一個。注意:子類別異常必須寫在父類別之前,否則會編譯錯誤。


throws / throw 關鍵字

  • throws: 用於方法簽名尾部,宣告該方法可能拋出的受檢異常,由呼叫者處理。
  • throw: 在方法體內主動拋出一個異常實例(新建或剛捕獲)。
public void withdraw(double amount) throws RemoteException, InsufficientFundsException {
    if (amount > balance) throw new InsufficientFundsException(amount - balance);
    balance -= amount;
}

finally 區塊:資源釋放的保障

finally 區塊無論異常是否發生、是否被捕獲、甚至 try/catch 中有 return,總會執行(極少數情況除外,如 System.exit())。常用於關閉檔案、釋放連線等收尾工作。

注意事項

  • catch 不能獨立存在,必須跟在 try 後。
  • finally 非強制,但 try 後至少要有一個 catch 或 finally。
  • try、catch、finally 之間不能插入其他程式碼。

自訂異常類別

開發領域特定異常時,需遵循:

  1. 所有異常必須繼承 Throwable。
  2. 受檢異常繼承 Exception。
  3. 非受檢異常繼承 RuntimeException。

範例:資金不足自訂異常

// InsufficientFundsException.java
public class InsufficientFundsException extends Exception {
    private double amount;
    public InsufficientFundsException(double amount) { this.amount = amount; }
    public double getAmount() { return amount; }
}

// CheckingAccount.java
public class CheckingAccount {
    private double balance;
    private int number;
    public CheckingAccount(int number) { this.number = number; }
    public void deposit(double amount) { balance += amount; }
    public void withdraw(double amount) throws InsufficientFundsException {
        if (amount <= balance) balance -= amount;
        else throw new InsufficientFundsException(amount - balance);
    }
    // getters...
}

// BankDemo.java
public class BankDemo {
    public static void main(String[] args) {
        CheckingAccount c = new CheckingAccount(101);
        c.deposit(500);
        try {
            c.withdraw(100);
            c.withdraw(600); // 拋出異常
        } catch (InsufficientFundsException e) {
            System.out.println("Sorry, but you are short $" + e.getAmount());
            e.printStackTrace();
        }
    }
}

執行結果:

Depositing $500...
Withdrawing $100...
Withdrawing $600...
Sorry, but you are short $200.0
InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25)
at BankDemo.main(BankDemo.java:13)

異常分類總結:JVM 異常 vs 程式級異常

  • JVM 異常: 由 JVM 自動拋出,如 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
  • 程式級異常: 由應用程式或 API 邏輯主動拋出,如 IllegalArgumentException、IllegalStateException。

掌握異常體系與處理機制,能編寫出更健壯、可維護的 Java 應用程式。

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