異常處理的概念:
異常exception又稱爲例外
java中生聲明瞭很多異常類,每個異常類都代表一種運行錯誤,異常類中包含了該類的運行錯誤信息與處理錯誤的方法
每當java程序運行過程中發生一個可識別的運行錯誤時,即該錯誤有一個異常類與之相對應時,系統會產生一個相應的該異常類的對象,即產生一個異常。
java異常處理機制的優點
1,將異常處理代碼從常規代碼中分離出來:即發生異常的地方可以將異常拋出,拋出到某一個地方統一處理
2,按異常類型和差別進行分組
3,支持自定義異常類
4,將異常信息傳播給調用棧,如果都不處理,則拋出到JVM,JVM輸出錯誤信息並終止程序
異常的分類
按照錯誤的嚴重程度不同,可分爲:
1,錯誤(Error類是所有錯誤的父類)
致命的,程序無法處理
2,異常(Exception類是所有異常的父類)
非致命分,有希望回覆的,可編制程序捕獲和處理
按照是否需要進行異常處理分類,可分爲:
1,非檢查型異常
不期望程序捕獲異常,在方法中不需要聲明處理異常,編譯器也不進行檢查。
繼承自RuntimeException。
不要求捕獲和生命的原因:
(1)RuntimeException在java中頻繁出現。
例如:如果每次使用對象的時候,都必須編寫異常代碼來檢查null引用,則程序會變成一個龐大的try-catch塊
(2)他們表示問題不一定作爲異常來處理。
例如:在除法運算的時候檢查0值,在引用前測試空值,而不使用ArithmeticException。
2,檢查型異常
程序需要聲明捕獲並處理異常
java預定義的一些常見異常:
非檢查性異常:
ArithmeticException:整數除法中除數爲0
NullPointerException:空指針異常,訪問的對象還沒有實例化
NegativeArraySizeException:創建數組時元素個數是負數
ArrayIndexOutOfBoundsException:數組下標越界
檢查性異常:
ArrayStoreException:程序試圖從數組中存取錯誤類型的數據
FileNotFoundException:文件沒有找到
IOException:通常的I/O錯誤
異常處理:
聲明拋出異常:
將異常使用throws子句將異常拋出到調用方法中,如果所有的方法都拋出了此異常,最後JVM將捕獲它,輸出相關的錯誤信息並終止程序運行。
捕獲異常:
使用try{}-catch{}塊,try{}中捕獲到異常並進行相應處理
捕獲異常的語法:
try{
可能產生異常的代碼塊
}catch(Exception e){
常用到兩個處理方法:
e.getMessage()返回一個字符串,描述發生的異常
e.printStackTrace ()給出一個方法的調用序列,一直到異常產生的位置
}finally{
可選塊,不論異常是否發生,finally都會執行,一般用來釋放資源,如數據庫連接
注意:如果try中有return,則在finally執行結束後才return且finally不改變函數返回值,如果finally中也有return,則函數通過finally返回
}
如果有多個catch塊時,將一般的異常放在後面,特殊異常放在前面,因爲一般異常包含特殊特殊異常
三種生成異常對象的方式:
1,由java虛擬機生成
2,由java類庫中某些類生成
3,在自己寫的程序中生成和拋出異常對象
自己生成異常對象:寫異常類繼承Exception類定義異常
自己拋出異常對象:throw new XXXException
自定義異常例子
//定義異常類
public class SmallNumException extends Exception{
public SmallNumException() {
super("that number is too big");
}
}
//使用自定義異常類,拋出異常對象
public class FinallyReturn {
public static void main(String[] args) {
int num = getNum();
System.out.println("最後返回值是" + num);
}
private static int getNum(){
int num = 4;
try{
num = num + 1;
if (num >= 5){
//拋出自定義的 數字太大異常
throw new SmallNumException();
}
return num;
}catch(Exception e) {
e.printStackTrace();
}
}
}