Bug vs. Exception:責任歸屬先分清
在動手寫防護罩之前,先搞懂到底是誰在背鍋:
Bug(工程師的技術失誤):
程式邏輯寫錯。例如算長方形面積寫成「寬 + 高」。純粹是工程師粗心或人為疏失,沒有藉口,必須乖乖打開 IDE 重修代碼。
Exception(使用者的鍋/突發的外界意外):
你的程式邏輯完全沒毛病,但「外界不按牌理出牌」。例如系統跳出輸入框要年齡,結果使用者偏偏輸入中文「十九歲」。
Exception 就是「例外」在意料之外的突發狀況!
為什麼文字特別容易引爆 Exception?
在電腦眼裡,所有外部輸入(鍵盤敲的、網頁表單送的),本質上都是字串(String)!
你以為使用者很乖輸入了數字 20?
電腦拿到的其實是穿著雙引號的文字 "20"。
當你呼叫 Integer.parseInt() 想把文字硬拆開轉成數字時,如果使用者給 "20",順利過關;
但只要遇到不按牌理出牌的 "十九歲" ,電腦會不知所措,這顆名為 NumberFormatException 的例外炸彈就會引爆!
一句話總結:
「Bug 是工程師寫錯代碼自己背鍋;Exception 是邏輯沒錯,但外界塞了意料之外的狀況砸場!」
防爆實驗室啟動:try 與 catch 的防恐演練
遇到不可控的外部輸入,爛程式會直接亮紅字死給你看;優秀的程式則是早就穿好防爆衣,準備好Plan B
這就是 try-catch 的分工合作:
try {
// 防爆實驗室(嘗試區)
// 凡是使用者可能不聽話、涉及型別硬轉的危險動作,統統在裡面跑!
String ageString = "十九歲"; // 致命點:字串裡裝的可能不是數字!
int age = Integer.parseInt(ageString); // 引爆點:文字轉數字宣告失敗!
// 如果上面炸了,下面這行直接跳過,絕不硬跑!
System.out.println("成功!你的年齡是:" + age);
} catch (NumberFormatException e) {
// 門口急救室(拆彈區)
// 只要炸彈型號對得上,立刻被穩穩接住,執行救援計畫!
System.out.println("攔截到爆炸!抓到使用者亂打文字!");
System.out.println("驗屍報告(死因):" + e.getMessage());
// 啟動備用方案:例如印出友善提示,叫使用者乖乖輸入阿拉伯數字
}
拆解三大拆彈角色:
try { ... } 是防爆實驗室:
電腦會抱著試試看的心態去跑。只要裡面任何一行引爆炸彈,後面剩下的程式碼全部即刻停擺、瞬間跳過,絕不把炸彈往後傳。
變數 e 是現場驗屍報告(遺言包):
爆炸的瞬間,Java 會把這起工安意外打包成一個物件叫作 e(Exception 的縮寫)。裡面巨細靡遺記錄著死因、哪一行出事、甚至犯罪現場。透過 e.getMessage(),我們就能看懂死者最後留下的遺言。
catch (型號 e) { ... } 是專屬急救站:
這就像派出了「專拆數字格式炸彈」的拆彈小組(NumberFormatException)。只要跟炸彈型號吻合,爆炸威力就會被安全吸收,程式不會崩潰死機,還能執行寫好的急救方案(例如:彈出視窗提醒「請輸入數字」,讓使用者重新輸入)