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

JavaSE 入門學習 26:Java 異常處理深度解析(下)

     編輯:Java 綜合教學

JavaSE 入門學習 26:Java 異常處理深度解析(下)

七、throws / throw 關鍵字

當方法未捕獲檢查性異常(Checked Exception)時,必須在方法簽名末尾使用 throws 關鍵字聲明可能拋出的異常類型。而 throw 則用於實際拋出一個異常實例(無論是新建還是剛捕獲的)。簡單區分:throw 是拋出動作,throws 是聲明將要拋出的異常類型。

聲明單一異常

import java.io.*;
public class ClassName {
    public void deposit(double amount) throws RemoteException {
        // 方法實現
        throw new RemoteException();
    }
    // 類的其餘定義
}

聲明多個異常

多個異常之間以逗號分隔:

import java.io.*;
public class ClassName {
    public void withdraw(double amount) throws RemoteException, InsufficientFundsException {
        // 方法實現
    }
}

八、finally 關鍵字

finally 代碼塊緊跟在 try-catch 之後,無論是否發生異常,其中的代碼都會被執行。常用於資源釋放、清理等收尾工作。

語法結構

try {
    // 程序代碼
} catch (異常類型1 變量名1) {
    // 處理代碼
} catch (異常類型2 變量名2) {
    // 處理代碼
} finally {
    // 無論如何都會執行的代碼
}

範例演示

public class Test {
    public static void main(String args[]) {
        int a[] = new int[2];
        try {
            System.out.println("Access element three: " + a[3]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Exception thrown: " + e);
        } finally {
            a[0] = 6;
            System.out.println("First element value: " + a[0]);
            System.out.println("The finally statement is executed");
        }
    }
}

運行結果顯示捕獲到數組下標越界異常,但 finally 塊依然執行。

使用注意事項

  1. catch 不能獨立於 try 存在。
  2. 在 try/catch 後添加 finally 並非強制。
  3. try 後不能既無 catch 也無 finally。
  4. try、catch、finally 之間不能插入其他代碼。

九、自定義異常

Java 允許開發者自定義異常類,需遵循以下規則:

  1. 所有異常必須繼承 Throwable。
  2. 檢查性異常繼承 Exception。
  3. 運行時異常繼承 RuntimeException。

實現步驟

  1. 繼承 java.lang.Exception 聲明異常類。
  2. 在方法適當位置用 throw 拋出自定義異常實例。
  3. 在方法聲明處用 throws 聲明該異常。

代碼示例

自定義異常類

class MyException extends Exception { }

業務異常類:InsufficientFundsException

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

使用異常的業務類:CheckingAccount

import java.io.*;
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 {
            double needs = amount - balance;
            throw new InsufficientFundsException(needs);
        }
    }
    public double getBalance() { return balance; }
    public int getNumber() { return number; }
}

測試類:BankDemo

public class BankDemo {
    public static void main(String[] args) {
        CheckingAccount c = new CheckingAccount(101);
        System.out.println("Depositing $500...");
        c.deposit(500.00);
        try {
            System.out.println("\nWithdrawing $100...");
            c.withdraw(100.00);
            System.out.println("\nWithdrawing $600...");
            c.withdraw(600.00);
        } catch (InsufficientFundsException e) {
            System.out.println("Sorry, but you are short $" + e.getAmount());
            e.printStackTrace();
        }
    }
}

編譯運行後,控制台輸出餘額不足的提示與堆棧信息。

十、通用異常分類

  • JVM 異常:由 Java 虛擬機拋出,如 NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException。
  • 程序級異常:由應用程序或 API 拋出,如 IllegalArgumentException、IllegalStateException。

十一、異常處理經驗總結

  1. 運行時異常優先用邏輯規避,輔以 try-catch。
  2. 多重 catch 後可加 catch(Exception) 兜底。
  3. 不確定代碼區塊建議包裹 try-catch。
  4. 避免僅用 printStackTrace() 輸出,應具體處理。
  5. 處理方式視業務需求與異常類型而定。
  6. 盡量添加 finally 釋放佔用資源。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved