iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
JavaScript

大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript系列 第 10

【Day 10】使用者不按牌理出牌?帶上 try-catch 防爆小組,程式絕不輕易死給你看

  • 分享至 

  • xImage
  •  
  1. Bug vs. Exception:責任歸屬先分清
    在動手寫防護罩之前,先搞懂到底是誰在背鍋:
    Bug(工程師的技術失誤):
    程式邏輯寫錯。例如算長方形面積寫成「寬 + 高」。純粹是工程師粗心或人為疏失,沒有藉口,必須乖乖打開 IDE 重修代碼。
    Exception(使用者的鍋/突發的外界意外):
    你的程式邏輯完全沒毛病,但「外界不按牌理出牌」。例如系統跳出輸入框要年齡,結果使用者偏偏輸入中文「十九歲」。
    Exception 就是「例外」在意料之外的突發狀況!
    為什麼文字特別容易引爆 Exception?
    在電腦眼裡,所有外部輸入(鍵盤敲的、網頁表單送的),本質上都是字串(String)!
    你以為使用者很乖輸入了數字 20?
    電腦拿到的其實是穿著雙引號的文字 "20"。
    當你呼叫 Integer.parseInt() 想把文字硬拆開轉成數字時,如果使用者給 "20",順利過關;
    但只要遇到不按牌理出牌的 "十九歲" ,電腦會不知所措,這顆名為 NumberFormatException 的例外炸彈就會引爆!
    一句話總結:
    「Bug 是工程師寫錯代碼自己背鍋;Exception 是邏輯沒錯,但外界塞了意料之外的狀況砸場!」

  2. 防爆實驗室啟動: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)。只要跟炸彈型號吻合,爆炸威力就會被安全吸收,程式不會崩潰死機,還能執行寫好的急救方案(例如:彈出視窗提醒「請輸入數字」,讓使用者重新輸入)

  1. 不同的死法:常見的例外型號清單
    Java 針對各種災難情境,準備了不同名字的例外類別
    ArithmeticException(算術例外):例如數學上的「除以零」(10 / 0),數學上無意義,電腦會當機抗議。
    NullPointerException(空指標例外):前幾天聊過的,對著還沒 new 出來的空空如也的變數下指令。
    IndexOutOfBoundsException(索引越界):陣列長度只有 3(索引 0, 1, 2)你偏偏要伸手去拿第 5 格(合法的格子只有 arr[0]、arr[1]、arr[2])arr[4]這個數字都早就超出陣列的邊界了!
    FileNotFoundException(檔案不存在):叫電腦去硬碟指定路徑抓檔案,結果檔案根本不在那。
    如果有很多預想不到的突發狀況怎麼辦?在 Java 裡,所有例外都有一個共同的老祖宗——Exception!如果寫 catch (Exception e),它就像一張無邊無際的安全大網,能把所有型號的炸彈通通抱住。

上一篇
【Day 9】心裡沒我就別想叫我!從互為配偶看懂 Java NullPointerException
系列文
大學以前只看過那隻貓?用白話文帶你從 Python 跨進 JavaScript10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言