在前面三天,我們學會了用 try-catch 拆彈接招、用 throw 主動點火引爆,以及用 finally / try-with-resources 收拾殘局。
但在真實戰場上,你一定遇過這種尷尬場面:當使用者在提款機輸入領取 $5000,但帳戶餘額只剩 $3000,你想引爆炸彈中斷流程,這時 Java 官方工具箱裡能借你什麼?
用 IllegalArgumentException(參數不合法)?好像有點勉強,數字 5000 本身是個合法正數啊。
用 ArithmeticException(數學運算錯誤)?也不是除以零,公式沒算錯。
用最通用的 Exception?又太過含糊,包山包海包各種錯。
當官方的罐頭炸彈詞不達意時,我們就自己造一顆貼上專屬標籤的客製化炸彈!
這就是自訂例外(Custom Exception)!
// 繼承 Exception:它就正式成為一顆具備合法身分的客製化炸彈!
public class InsufficientBalanceException extends Exception {
// 無參數建構子 1:不帶客製遺言的預設版
public InsufficientBalanceException() {
super("帳戶餘額不足!"); // 呼叫父類別,交出公版遺言
}
//使用時機: 呼叫者throw new InsufficientBalanceException();new 出來的括號不帶字,子類別幫他做主,直接寫死的"帳戶餘額不足!" 塞給父類別,老爸一律幫你發「帳戶餘額不足!」的公告。
// 有參數建構子 2:讓引爆者自由填寫詳細死因的旗艦版
public InsufficientBalanceException(String message) {
super(message); // 透過 super(message) 老爸會照單全收如實發布
//使用時機: 呼叫者想把案發現場的數據交代清楚,括號裡帶入即時動態字串
throw new InsufficientBalanceException("領 5000 失敗,戶頭只剩 3000 元!");
你可以在引爆瞬間把現場發生的恩怨情仇(message)寫上去
}
}
這段程式碼背後的兩大精髓:
類別名稱就是炸彈型號(見名知意):
命名黃金法則永遠是「具體情境 + Exception」,例如 InsufficientBalanceException(餘額不足)、UserNotFoundException(查無此人)。隊友光看錯誤型號,不用看程式碼就知道出了什麼大事。