## Java編程那些事兒81——異常處理概述
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 第十章異常處理
在實際的項目中,程序執行時經常會出現一些意外的情況,這些意外的情況會導致程序出錯或者崩潰,從而影響程序的正常執行,如果不能很好的處理這些意外情況,將使項目的穩定性不強。
對于這些程序執行時出現的意外情況,在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等。
該類異常在語法上強制程序員必須進行處理,如果不進行處理則會出現語法錯誤。
熟悉異常類的分類,將有助于后續語法中的處理,也使得在使用異常類時可以選擇恰當的異常類類型。
由于異常類的數量非常多,在實際使用時需要經常查閱異常類的文檔,下面列舉一些常見的異常類,如下表所示:
常見異常類
<table class="MsoNormalTable" style="margin: auto auto auto 26.7pt; border-collapse: collapse; mso-table-layout-alt: fixed; mso-border-alt: solid black .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid black; mso-border-insidev: .5pt solid black;" border="1" cellspacing="0" cellpadding="0"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;"><td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 191.35pt; padding-top: 0cm; background-color: transparent; mso-border-alt: solid black .5pt; border: black 1pt solid;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">異常類類名</span></span></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">功能說明</span></span></p></td></tr><tr style="mso-yfti-irow: 1;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">java.lang.NullPointerException</span></span></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: small;"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">空指針異常,調用</span><span lang="EN-US"><span style="font-family: Calibri;">null</span></span><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">對象中的非</span><span lang="EN-US"><span style="font-family: Calibri;">static</span></span><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">成員變量或成員方法時產生該異常</span></span></p></td></tr><tr style="mso-yfti-irow: 2;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">java.lang.ArrayIndexOutofBoundsException</span></span></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-size: small;"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">數組下標越界異常,數組下標數值小于</span><span lang="EN-US"><span style="font-family: Calibri;">0</span></span><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;">或大于等于數組長度時產生該異常</span></span></p></td></tr><tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes;"><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;">java.lang.IllegalArgumentException</span></span></p></td><td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: #d4d0c8; padding-left: 5.4pt; padding-bottom: 0cm; border-left: #d4d0c8; width: 191.35pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt;" width="255" valign="top"><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center;" align="center"><span style="font-family: 宋體; mso-ascii-font-family: Calibri; mso-hansi-font-family: Calibri;"><span style="font-size: small;">非法參數異常,當參數不合法時產生該異常</span></span></p></td></tr></tbody></table>
下面來介紹一下異常處理的相關語法。
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結