異常的產生過程解析
先運行下面的程序,程序會產生一個數組索引越界異常ArrayIndexOfBoundsException。我們通過圖解來解析下異常產生的過程。
工具類
class ArrayTools{ //對給定的數組通過給定的角標獲取元素。
public static int getElement(int[] arr,int index) { int element = arr[index]; return element; } }
測試類
class ExceptionDemo2 { public static void main(String[] args) { int[] arr = {34,12,67}; int num = ArrayTools.getElement(arr,4) System.out.println("num="+num); System.out.println("over"); } }
上述代碼執行過程圖解:
拋出異常throw
在java中,提供了一個throw關鍵字,它用來拋出一個指定的異常對象。
1,創建一個異常對象。封裝一些提示信息。
2,需要將這個異常對象告知給調用者。throw 異常對象;
throw用在方法內,用來拋出一個異常對象,將這個異常對象傳遞到調用者處,並結束當前方法的執行。
//使用格式:
throw new 異常類名(參數); //例如:
throw new NullPointerException("要訪問的arr數組不存在"); throw new ArrayIndexOutOfBoundsException("該索引在數組中不存在,已超出范圍");
聲明異常throws
聲明:將問題標識出來,報告給調用者。如果方法內通過throw拋出了編譯時異常,而沒有捕獲處理(稍后講解該方式),那么必須通過throws進行聲明,讓調用者去處理。
聲明異常格式:
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2… { }
聲明異常的代碼演示:
class Demo{ /* 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws關鍵字進行聲明。 */
public void show(int x)throws Exception { if(x>0){ throw new Exception(); } else { System.out.println("show run"); } } } class Demo{ /* 如果定義功能時有問題發生需要報告給調用者。可以通過在方法上使用throws關鍵字進行聲明。 */
public void show(int x)throws Exception { if(x>0){ throw new Exception(); } else { System.out.println("show run"); } } }
throws用於進行異常類的聲明,若該方法可能有多種異常情況產生,那么在throws后面可以寫多個異常類,用逗號隔開。
//多個異常的情況,例如:
public static int getElement(int[] arr,int index) throws NullPointerException, ArrayIndexOutOfBoundsException { if(arr==null){ throw new NullPointerException("arr指向的數組不存在"); } if(index<0 || index>=arr.length){ throw new ArrayIndexOutOfBoundsException("錯誤的角標,"+index+"索引在數組中不存在"); } int element = arr[index]; return element; }
捕獲異常try…catch…finally
捕獲:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理
捕獲異常格式:
try { //需要被檢測的語句。
} catch(異常類 變量) { //參數。 //異常的處理語句。
} finally { //一定會被執行的語句。
}
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
class ExceptionDemo{ public static void main(String[] args){ //throws ArrayIndexOutOfBoundsException
try { int[] arr = new int[3]; System.out.println( arr[5] );// 會拋出ArrayIndexOutOfBoundsException
當產生異常時,必須有處理方式。要么捕獲,要么聲明。 } catch (ArrayIndexOutOfBoundsException e) { //括號中需要定義什么呢?try中拋出的是什么異常,在括號中就定義什么異常類型。
System.out.println("異常發生了"); } finally { arr = null; //把數組指向null,通過垃圾回收器,進行內存垃圾的清除
} System.out.println("程序運行結果"); } }
try…catch…finally異常處理的組合方式
try catch finally組合:檢測異常,並傳遞給catch處理,並在finally中進行資源釋放。
try catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對異常進行捕獲處理。
void show(){ //不用throws
try{ throw new Exception();//產生異常,直接捕獲處理
}catch(Exception e){ //處理方式
} }
一個try 多個catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對每種異常信息進行不同的捕獲處理。
void show(){ //不用throws
try{ throw new Exception();//產生異常,直接捕獲處理
}catch(XxxException e){ //處理方式
}catch(YyyException e){ //處理方式
}catch(ZzzException e){ //處理方式
} }
注意:這種異常處理方式,要求多個catch中的異常不能相同,並且若catch中的多個異常之間有子父類異常的關系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。
try finally 組合: 對代碼進行異常檢測,檢測到異常后因為沒有catch,所以一樣會被默認jvm拋出。異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所有finally。只為關閉資源。
void show(){//需要throws
try{ throw new Exception(); }finally { //釋放資源
} }