一、什麼是異常?爲什麼需要處理?¶
想象一下,你寫了一段Java代碼,比如計算兩個數的商。但如果用戶輸入的除數是0,程序會突然彈出一個錯誤窗口,然後直接停止運行——這就是程序遇到了“異常”。
異常就像程序運行中的“小意外”,比如突然停電、文件找不到、網絡斷開等。如果不處理這些異常,程序可能直接崩潰,用戶體驗會非常差。而通過 try-catch 捕獲異常,就能讓程序“冷靜處理”這些意外,繼續穩定運行。
二、try-catch的基本語法和執行流程¶
try-catch 的核心作用是:把可能出錯的代碼放在 try 塊中,一旦出錯,catch 塊會捕獲並處理錯誤。
語法結構:¶
try {
// 可能發生異常的代碼(比如:除法運算、數組訪問等)
} catch (異常類型 變量名) {
// 異常發生時執行的代碼(通常是打印錯誤信息)
}
執行流程:¶
- 如果
try塊中沒有異常,catch塊的代碼不會執行,程序會繼續執行try-catch之後的代碼。 - 如果
try塊中發生異常,try塊中異常之後的代碼不會執行,程序會立即跳轉到對應的catch塊執行,執行完catch塊後繼續往下運行。
三、實戰:用try-catch處理常見異常¶
示例1:處理“除零異常”(ArithmeticException)¶
比如我們寫一個簡單的除法程序:
public class TryCatchDemo {
public static void main(String[] args) {
int a = 10;
int b = 0; // 故意設爲0,觸發除零異常
try {
int result = a / b; // 這裏會拋出ArithmeticException
System.out.println("計算結果:" + result); // 這行代碼不會執行
} catch (ArithmeticException e) {
// 捕獲到異常後執行:打印錯誤信息
System.out.println("錯誤:除數不能爲0!");
}
// 異常處理後,程序繼續運行
System.out.println("程序未崩潰,繼續執行後續代碼!");
}
}
輸出結果:
錯誤:除數不能爲0!
程序未崩潰,繼續執行後續代碼!
關鍵點:try 塊中的 a/b 拋出異常後,catch 塊捕獲到 ArithmeticException,執行錯誤提示,而後續的 System.out.println 正常執行。
示例2:處理“空指針異常”(NullPointerException)¶
當你不小心把對象設爲 null 並調用方法時,會拋出空指針異常:
public class NullExceptionDemo {
public static void main(String[] args) {
String str = null; // 字符串變量str被賦值爲null
try {
str.length(); // 調用null對象的length()方法,會拋出NullPointerException
System.out.println("字符串長度:" + str.length()); // 這行代碼不會執行
} catch (NullPointerException e) {
System.out.println("錯誤:str是空對象,不能調用length()方法!");
}
System.out.println("程序繼續運行!");
}
}
輸出結果:
錯誤:str是空對象,不能調用length()方法!
程序繼續運行!
四、常見異常類型及應對方法¶
1. 除零異常(ArithmeticException)¶
- 場景:
int result = 10 / 0; - 應對:確保除數不爲0,或用
try-catch捕獲。
2. 數組越界異常(ArrayIndexOutOfBoundsException)¶
- 場景:
int[] arr = {1, 2, 3}; arr[3] = 5;(數組索引最大是2,卻用了3) - 應對:檢查數組索引是否合法(小於數組長度)。
3. 空指針異常(NullPointerException)¶
- 場景:
Object obj = null; obj.method();(調用null對象的方法) - 應對:確保對象不爲null,或用
try-catch捕獲。
五、finally塊:無論是否異常,都要執行的代碼¶
finally 塊是可選的,但非常重要!無論 try 塊是否發生異常,finally 塊中的代碼都會執行。常用於釋放資源(如關閉文件、數據庫連接)。
示例:
try {
// 嘗試打開文件/數據庫連接(可能出錯)
System.out.println("嘗試打開資源...");
} catch (Exception e) {
System.out.println("資源打開失敗!");
} finally {
// 無論是否出錯,都關閉資源
System.out.println("無論是否出錯,都會執行關閉操作!");
}
六、異常處理的最佳實踐¶
-
捕獲具體異常:不要只捕獲
Exception(父類異常),而是捕獲具體異常類型(如ArithmeticException),避免“過度捕獲”。 -
不要忽略異常:至少打印錯誤信息(如
e.printStackTrace()),方便調試。例如:
catch (Exception e) {
e.printStackTrace(); // 打印異常堆棧信息,方便定位問題
}
- 合理使用finally:確保資源(文件、網絡連接等)被正確關閉,避免資源泄漏。
總結¶
try-catch 是Java中處理異常的核心工具,能讓程序在遇到“意外”時不崩潰,繼續穩定運行。記住:異常就像生活中的小意外,提前準備好“應對方案”(try-catch),才能讓程序更健壯、更可靠。
通過本文的學習,你已經掌握了異常處理的基本方法,接下來可以嘗試在自己的代碼中加入 try-catch,讓程序“聰明”地應對錯誤吧!