Java異常( Throwable)的處理以及常見的異常類列表
異常指Java程式執行中遇到的非致命性錯誤,而不是編譯時期的語法錯誤,比如0溢位、陣列越界、檔案找不到等。
Java面向物件的方式來處理異常,異常也被看成物件,和一般物件也沒有什麼區別,但異常必須是Throwable的類及其子類所產生的物件的例項。它也像其他物件一樣封裝了資料和方法。
Throwable物件在定義中包含一個字串資訊,而這個屬性可以被所有的異常類繼承,Java程式中,異常處理的機制為:丟擲異常、捕捉異常。
當程式出現一些問題的,可以是嚴重問題,可以是一種異常,將這些通常為Throwable
Throwable 類是 Java 語言中所有錯誤或異常的超類Throwable
error
exception
舉例:
張三去山上旅行
1)張三騎車去旅行,山路崩塌了,不能前行了----->不可抗力因素error:屬於嚴重問題 記憶體溢位了 (載入頁面中大量圖片的時候,程式會掛掉---使用第三方的框架去處理:ImageLoader)
2)張三騎車去旅行,騎著發現輪胎沒氣了------->需要檢查的問題。屬於編譯時期異常:只要出現的不是執行時期異常,統稱為編譯時期 日期的文字格式---解析 java.util.Date型別:ParseException:解析異常
編譯時期異常:開發者必須處理!
異常的處理分為兩種:
(1)try...catch...finally (標準格式) :捕獲異常(2)throws ...丟擲異常
變形格式...
(1) try...catch...
(2) try...catch...catch...
(3) catch....
變形格式的第一種(1) try...catch...
try{
一些程式碼try裡面的程式碼越少越好
程式碼包含了可能會出現問題的程式碼
}catch(異常類 異常類物件){
try出現異常了,描述的異常剛好就是catch的異常類,就會執行catch裡面程式碼
//處理異常 }
如何處理多個異常兩個或兩個以上的異常的時候怎麼辦?此時採用變形格式 (2) try...catch...catch...
try{
可能出現問題的程式碼
int[] arr = {1,2,3} ;
Sop(arr[3]);
int a = 10 ;
int b =0 ;
Sop(a/b) ;
}catch(異常類名1 物件名1){//異常處理
}catch(異常類名2 物件名2(){//異常處理
}
try...catch...finally
finally語句體是一定會執行的,除非是Jvm退出了
問題:如果catch裡面有return 語句,finally中的程式碼還會執行,是在return語句之前執行還是return後執行?
答:finally中程式碼是一定會執行的,是在return前
程式示範如下:
public static void main(String[] args) {
System.out.println(getInt());
}
private static int getInt() {
int a ;
try {
a = 10 ;
System.out.println(a/0);
a = 20 ;
}catch(Exception e) {
a= 30 ;
return a ;
/**
* try的程式碼出現問題了,執行catch中的語句,30賦值a,
* return 30(已經形成了一個迴路徑)finally程式碼一定會執行(除非Jvm) a = 40 ,在fianlly外面
* 有return a: a記錄迴路徑的那個a,返回30
*/
}finally {
//除非jvm退出了
a = 40 ;
}
return a;//30
}
異常中的注意事項:
*子類繼承父類的時候的注意事項
*1)子類重寫父類的方法的時候,子類的方法的丟擲的異常必須要麼是父類的方法異常一樣,要麼是父類方法異常的子類
*2)子類重寫父類方法的時候,如果父類中的這個方法沒有丟擲異常,那麼子類重寫的這個方法也不能丟擲異常,只能try...catch
*/
異常類名稱 | 異常原因 |
ArithmeticException | 數學錯誤,被0除 |
ArraylndexOutOfBoundsException | 陣列下標越界 |
ArrayStoreException | 程式試圖在陣列中儲存錯誤型別的資料 |
ClassCastException | 型別強制轉換異常 |
IndexOutOfBounchsException | 當某物件的索引超出範圍時丟擲異常 |
NegativeArraySizeException | 建立元素個數為負的陣列異常類 |
NullPointException | 空指標異常 |
NumberFormatException | 字串轉換為數字異常類 |
SecurityException | Applet試圖執行瀏覽器的安全設定不允許的動作 |
StringIndexOutBounchsException | 程式試圖訪問字串中字元不存在的字元位置 |
OutOfMemoryException | 分配給新物件的記憶體太小 |
SockedException | 不能正常完成Socked操作 |
ProtocolException | 網路協議有錯誤 |
ClassNotFoundException | 未找到相應的異常類 |
EOFException | 檔案結束異常 |
FileNotFoundException | 檔案未找到異常 |
illegalAccessException | 訪問某類被拒絕時丟擲的異常 |
InstantiationException | 試圖通過new Instance()方法建立一個抽象 類或抽象介面的例項時出現的異常 |
IOException | 輸入、輸出異常 |
NoSuchFileException | 欄位未找到異常 |
NoSuchMethodException | 方法未找到異常 |
SQLException | 操作資料庫異常 |
throws和throw的區別?
throws:也是表示丟擲異常,它後面跟的異常類名,並且可以多個異常類名中間逗號開
舉例:public void show() throws IoException,ClassNotFoundException{...}
在方法上丟擲,由呼叫者處理
它表示丟擲異常的可能性
throw:丟擲的一個異常物件
在語句體中丟擲的,由語句體進行處理
它表示丟擲異常的肯定性