幾乎所有的代碼裏面都會出現異常,爲了保證程序在出現異常之後可以正常執行完畢,就需要進行異常處理。
先來看一下異常的繼承類結構
所有的異常都是由Throwable繼承而來,我們來看他下面的兩個子類Error和Exception.
Error類描述了Java運行時內部錯誤和資源耗盡錯誤。應用程序不拋出此類異常,這種內部錯誤一旦出現,除了告知用戶並使程序安全終止之外,再無能無力。這種情況很少出現。
我們需要關心的是Exception以及其子類。在Exception之下又分爲兩個分支,RuntimeException和IOException。
由於程序錯誤導致的異常屬於RuntimeException;而如果程序本身沒有問題,但由於像I/O錯誤這類問題導致的異常屬於IOException。
Java語言規範將派生於Error類或RuntimeException類的所有異常稱爲非受查異常;所有的其他異常稱爲受查異常
異常的影響
異常是導致程序中斷執行的一種指令流。程序之中如果出現異常並且沒有合理處理的話就會導致程序終止執行。
範例:觀察正確程序流
此時沒有任何異常產生,程序可以正常執行完畢。
範例:產生異常
數學計算開始前 Exception in thread"main"java.lang.ArithmeticException: / by zero at test.Test.main(Test.java:6)
現在程序之中產生了異常,但是在異常語句產生之前的語句可以正常執行完畢,而異常產生之後程序直接進行了結束。爲了保證程序出現異常後還可以繼續向下執行,就需要異常處理。
異常處理格式
異常處理的語法格式如下:
對於以上三個關鍵字,可以出現的組合: try…catch 、 try…finally 、 try…catch…finally
範例:對異常進行處理
出現了異常之後,由於存在異常處理機制,依然可以正常執行完畢。
以上代碼雖然進行了異常處理,但是存在一個問題:你現在根本不知道程序產生了什麼樣的異常。所以爲了明確的
取得異常信息,可以直接輸出異常類對象,或者調用所有異常類中提供的printStackTrace()方法進行完整異常信息的輸出。
範例:取得異常的完整信息
在進行異常處理的時候還可以使用 try…catch…finally 進行處理。
範例:使用 try…catch…finally 進行處理
不管此時是否產生異常,最終都要執行finally程序代碼,所以finally會作爲程序統一出口。
以上程序是直接固定好了兩個數字進行除法運算,現在通過初始化參數來進行除法運算
範例:初始化參數進行數學運算
public class Test {
public static void main(String[] args) {
System.out.println("[1].數學計算開始前");
try {
int x = Integer.parseInt(args[0]) ;
int y = Integer.parseInt(args[1]) ;
System.out.println("[2].進行數學計算:"+x/y);
} catch (ArithmeticException e) {
e.printStackTrace();
}finally {
System.out.println("[Finally]不管是否產生異常,都執行此語句");
}
System.out.println("[3].數學計算結束後");
}
}
此時會存在如下問題:
- 用戶沒有輸入初始化參數:ArrayIndexOutOfBoundsException
- 用戶輸入的不是數字:NumberFormatException
- 被除數爲0:ArithmeticExceptio
以上代碼我們發現,通過catch捕獲異常的時候如果沒有捕獲指定異常,程序依然無法進行處理,現在最直白的解
決方法就使用多個catch。