硬件的錯誤、輸入錯誤、物理限制等問題,都可能導致程序運行時的異常出現。
1.異常的分類層次
在java中,異常對象都是由Throwable類繼承而來的,主要分為兩大類:
Error和Exception類。
在Exception中又分為:
RuntimeException異常和非RuntimeException異常。
異常的分類有以下幾種:
1.Error類層次的結構主要描述了java運行時系統的內部錯誤和資源耗盡等錯誤,如硬件錯誤、輸入錯誤數據、系統崩潰等。出現這些系統內部的問題,除了通知用戶并盡量安全退出,基本上程序員也無能為力了,所以這種情況一般不要求解決,當然,這種情況也很少出現。
2.RuntimeException的異常時指運行時異常,也稱為未檢查異常。一般是由于程序員自己的問題造成的,如錯誤的類型轉換、數組訪問越界、訪問空指針等。這些都是可以通過程序員的細心處理和認真分析來避免的。如在轉換類型時檢查,通過檢查下標來防止越界,使用變量前檢查是否為空來杜絕空指針異常。
3.非RuntimeException異常,也就是已檢查異常。常見的已檢查異常主要有以下幾種:java.io.IOEeception(IO異常,輸入輸出設備不存在,比如在文件的末尾讀取數據)和java.io.FileNotFoundException(文件未找到異常)和java.lang.ClassNotFoundException(動態地裝載某個類時,找不到此類)
注意:對于已檢查異常必須處理,對于未檢查異常可以處理也可以不處理
Java異常類層次結構圖:

2.捕獲和處理異常
語法規則:
finally語句塊內的語句無論在什么時候在什么情況下都會被執行,經常會寫一些釋放資源的語句。如果前面語句中有一個return的值,finally中也有一個return的值,那么返回的一定是fianlly中return的值。
finally和catch可以省略其中的一個,但是不能同時省略
示例:
上面代碼中case的前四句話必定會拋出異常:
case:0是零做了除數;
case:1是數組沒有賦值,也就是沒有初始化就使用
case:2是數組越界
case: 3是字符串越界
結果:

3.異常的匹配
如果try語句后跟多個catch語句,那么排列的先后順序如下所示:
1.如果多個catch語句塊中所指定的異常類型級別相同或者沒有任何派生關系,則catch語句排列無序。2.如果多個catch語句塊中所指定的異常類型相互之間有派生關系,則必須子類型的異常寫在上面,父類型的異常寫在下面。
1.自定義異常
當系統中已有的異常類型不能滿足使用要求時,可以根據自己的需要拋出自定義異常的對象。自定義異常類一般通過充當捕獲異常的角色,所以從Exception類或者其他的捕獲異常類繼承就可以了其語法格式如下:
自定義的異常類一般都會編寫必要的構造方法和一些適當的功能方法,而且一般都會有兩個構造方法:
一個是無參的構造方法
一個是以字符串做參數的構造方法
以字符串做參數的構造方法可以在有出錯信息的情況下創建異常對象。
示例:
2.拋出異常
在聲明或者方法中拋出異常,主要內容和使用方法如下:在編程中會遇到很多異常,如果該程序有能力解決,可以用try/catch方法主動獲取和處理異常。當不具備對異常進行處理的能力時,則向上拋出異常,直到拋到能夠處理異常的位置。
拋出異常的語法是:
比如,有一個m方法拋出了IOException和InterruptedException。代碼如下:
throws用來聲明該方法將有可能拋出的異常,將可能拋出的異常列在throws后面,用逗號隔開
在方法體中處理異常的時候,也可以將這兩種捕獲異常再拋出,使用throws語句就可以將一個異常對象拋出語法格式為:
當一個方法中出現異常,而沒有處理,則以異常對象為返回值返回調用處,然后逐級傳遞。如果一直沒有捕獲和處理,最終異常將返回虛擬機,虛擬機終止退出,程序結束。
示例:
自定義異常:
職員及相應方法:
新聞熱點
疑難解答