第十章 異常處理
在實際的項目中,程序執行時經常會出現一些意外的情況,這些意外的情況會導致程序出錯或者崩潰,從而影響程序的正常執行,如果不能很好的處理這些意外情況,將使項目的穩定性不強。
對於這些程序執行時出現的意外情況,在Java語言中被稱作異常(Exception),出現異常時相關的處理則稱之為異常處理。
異常處理是Java語言中的一種機制,恰當使用異常處理可以使整個項目更加穩定,也使項目中正常的邏輯代碼和錯誤處理的代碼實現分離,便於代碼的閱讀和維護。
本章就將深入介紹Java語言中的異常處理機制。
10.1 概述
在實際的項目中,並不是所有的情況都是那樣理想,例如不可能有使用不盡的內存,也不可能有熟練的軟件使用人員等,這樣就會導致項目在執行時會出現各種各樣不可預料的情況,這樣的情況如果處理不好,則會導致程序崩潰或者中止執行,例如Windows操作系統的藍屏。
在一個完善的項目,這些不可預料的情況必須得到正確的處理,才能使整個項目具有比較強的穩定性,這才是符合要求的項目。為了實現這種處理結構,在Java語言中新增了一套完善的語法,通過處理這些情況來增強項目的穩定性,這套語法就是異常處理的語法。
這些程序執行時出現的不可預料的情況,也就是執行時的意外情況,在Java語言的語法中被稱作異常。
其實簡單的進行異常處理很多程序設計語言都是可以實現的,就是根據情況判斷,不同的情況作出不同的處理。Java語言的異常處理機制最大的優勢之一就是可以將異常情況在方法調用中進行傳遞,通過傳遞可以將異常情況傳遞到合適的位置再進行處理。這種機制就類似於現實中你發現了火災,你一個人是無法撲滅大火的,那麼你就將這種異常情況傳遞給119,然後119再將這個情況傳遞給附近的消防隊,消防隊及時趕到進行滅火。使用這種處理機制,使得Java語言的異常處理更加靈活。
另外,使用異常處理機制,可以在源代碼級別將正常執行的邏輯代碼,和進行異常情況處理的代碼相分離,更加便於代碼的閱讀。
異常處理機制是Java語法的一個特色功能,通過恰當的使用該機制,可以使得Java語言編寫的項目更加穩定。
當然,異常處理機制也存在一些弊端,例如使用異常處理將降低程序的執行效率,增加語法的復雜度等。
下面簡單的看一個執行時將出現異常的代碼:
/**
* 異常出現示例
*/
public class ExceptionDemo {
public static void main(String[] args) {
String s = null;
int len = s.length();
}
}
在運行該程序時,在控制台的輸出結果如下:
Exception in thread "main" java.lang.NullPointerException
at ExceptionDemo.main(ExceptionDemo.java:7)
從這個程序執行時的輸出可以看出,提示在main線程(thread)中出現了異常,異常的類型為java.lang.NullPointerException,異常出現在ExceptionDemo的main方法中,出現異常的代碼在ExceptionDemo.java代碼中的第7行。在JDK文檔查閱java.lang包,在異常部分可以查閱到關於NullPointerException的詳細說明。這裡出現該異常是因為對象s沒有創建造成的。將程序中的String s = null;代碼替換為String s = “abc”;即可避免出現該異常。
在程序執行中,會出現各種各樣的異常情況,這些異常情況在Java體系將代表常見的異常情況,這就是下面的異常類體系中需要介紹的知識。
10.2 異常類體系
在Java語言以前,代表各種異常情況一般使用數字,例如常見的浏覽器中的404錯誤,以及Windows中的錯誤編號等,使用這些數字可以代表各種異常情況,但是最大的不足在於這些數字不夠直觀,無法很直接的從這些數字中知道異常出現的原因。
所以在Java語言中代表異常時,不再使用數字來代表各種異常的情況,而是使用一個專門的類來代表一種特定的異常情況,在系統中傳遞的異常情況就是該類的對象,所有代表異常的類組成的體系就是Java語言中的異常類體系。
為了方便對於這些可傳遞對象的管理,Java API中專門設計了java.lang.Throwable類,只有該類子類的對象才可以在系統的異常傳遞體系中進行。該類的兩個子類分別是:
1、Error類
該類代表錯誤,指程序無法恢復的異常情況。對於所有錯誤類型以及其子類,都不要求程序進行處理。常見的Error類例如內存溢出StackOverflowError等。
2、Exception類
該類代表異常,指程序有可能恢復的異常情況。該類就是整個Java語言異常類體系中的父類。使用該類,可以代表所有異常的情況。
在Java API中,聲明了幾百個Exception的子類分別來代表各種各樣的常見異常情況,這些類根據需要代表的情況位於不同的包中,這些類的類名均以Exception作為類名的後綴。如果遇到的異常情況,Java API中沒有對應的異常類進行代表,也可以聲明新的異常類來代表特定的情況。
在這些異常類中,根據是否是程序自身導致的異常,將所有的異常類分為兩種:
1、RuntimeException及其所有子類
該類異常屬於程序運行時異常,也就是由於程序自身的問題導致產生的異常,例如數組下標越界異常ArrayIndexOutOfBoundsException等。
該類異常在語法上不強制程序員必須處理,即使不處理這樣的異常也不會出現語法錯誤。
2、其它Exception子類
該類異常屬於程序外部的問題引起的異常,也就是由於程序運行時某些外部問題導致產生的異常,例如文件不存在異常FileNotFoundException等。
該類異常在語法上強制程序員必須進行處理,如果不進行處理則會出現語法錯誤。
熟悉異常類的分類,將有助於後續語法中的處理,也使得在使用異常類時可以選擇恰當的異常類類型。
由於異常類的數量非常多,在實際使用時需要經常查閱異常類的文檔,下面列舉一些常見的異常類,如下表所示:
常見異常類
異常類類名 功能說明 java.lang.NullPointerException 空指針異常,調用null對象中的非static成員變量或成員方法時產生該異常 java.lang.ArrayIndexOutofBoundsException 數組下標越界異常,數組下標數值小於0或大於等於數組長度時產生該異常 java.lang.IllegalArgumentException 非法參數異常,當參數不合法時產生該異常
下面來介紹一下異常處理的相關語法。