一、什么是異常:
異常就是在運行時產生的問題。通常用Exception描述。
在java中,把異常封裝成了一個類,當出現問題時,就會創建異常類對象並拋出異常相關的信息(如詳細信息,名稱以及異常所處的位置)。
二、異常的繼承關系:
Throwable類是所有錯誤跟異常類的超類(祖宗類)。
Exception異常類及其子類都是繼承自Throwable類,用來表示java中可能出現的異常,並且合理的處理這些異常。
RuntimeException類是運行異常類,繼承自Exception類,它以及它的子類只能在運行過程中存在,當出現時,只能修改源代碼,此異常無法處理。
Error類是與Exception的平級的類,用來表示Java中存在的嚴重錯誤,只能通過修改代碼來解決問題。
繼承體系的總結:
Throwable: 它是所有錯誤與異常的超類(祖宗類) |- Error 錯誤 |- Exception 編譯期異常,進行編譯JAVA程序時出現的問題 |- RuntimeException 運行期異常, JAVA程序運行過程中出現的問題
三、異常與錯誤的區別:
異常是指程序在編譯或者運行時出現的某種異常問題,我們可以對異常進行某種處理,如果不處理異常的話,程序將會停止運行。
錯誤是指程序在運行時出現的嚴重問題,無法處理,程序將會停止運行,Error通常都是系統級別的問題,都是虛擬機jvm所在系統發生的,只能通過修改源代碼解決問題。
四、異常產生的過程:
1.運行或編譯時產生異常
2.創建異常類的對象
3.聲明異常類
4.將異常類對象傳給調用者(main()方法)處理
5.調用者無法處理,再將異常類對象傳給jvm虛擬機
6.jvm虛擬機將異常類的信息(名稱、詳細信息、異常所處的位置)打印在屏幕上,並且停止程序的運行
五、拋出異常throw
在java中,提供了一個throw關鍵字,用來拋出一個指定的異常。
使用方法:
1.創建一個異常對象。封裝一些提示信息
2.將這個異常告知調用者
使用格式:
throw new 異常類名(參數);
六、聲明異常throws
聲明異常格式:
修飾符 返回值類型 方法名稱 (參數)throws 異常1名稱,異常2名稱{
}
七、捕獲異常try...catch...finally
捕獲異常:Java中對異常有針對性的語句進行捕獲,可以對出現的異常進行指定方式的處理
語句格式:
try { //需要被檢測的語句。 } catch(異常類 變量) { //參數。 //異常的處理語句。 } finally { //一定會被執行的語句。 }
try:該代碼塊中編寫可能產生異常的代碼。
catch:用來進行某種異常的捕獲,實現對捕獲到的異常進行處理。
finally:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程序跳轉,導致有些語句執行不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
捕獲異常的組合方式:
1. try catch finally組合:檢測異常,並傳遞給catch處理,並在finally中進行資源釋放。
2. try catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對異常進行捕獲處理。
3. 一個try 多個catch組合 : 對代碼進行異常檢測,並對檢測的異常傳遞給catch處理。對每種異常信息進行不同的捕獲處理。
注意:這種異常處理方式,要求多個catch中的異常不能相同,並且若catch中的多個異常之間有子父類異常的關系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。
4. try finally 組合: 對代碼進行異常檢測,檢測到異常后因為沒有catch,所以一樣會被默認jvm拋出。異常是沒有捕獲處理的。但是功能所開啟資源需要進行關閉,所有finally。只為關閉資源。
八、運行時期異常 RuntimeExecption
特點:
方法中拋出運行時期異常,方法定義中無需throws聲明,調用者也無需處理此異常
運行時期異常一旦發生,需要程序人員修改源代碼
九、異常在方法重寫中細節
1. 子類覆蓋父類方法時,如果父類的方法聲明異常,子類只能聲明父類異常或者該異常的子類,或者不聲明。
class Fu { public void method () throws RuntimeException { } } class Zi extends Fu { public void method() throws RuntimeException { } //拋出父類一樣的異常 //public void method() throws NullPointerException{ } //拋出父類子異常 }
2.當父類方法聲明多個異常時,子類覆蓋時只能聲明多個異常的子集
class Fu { public void method () throws NullPointerException, ClassCastException{ } } class Zi extends Fu { public void method()throws NullPointerException, ClassCastException { }
public void method() throws NullPointerException{ } //拋出父類異常中的一部分 public void method() throws ClassCastException { } //拋出父類異常中的一部分 }
3.當被覆蓋的方法沒有異常聲明時,子類覆蓋時無法聲明異常的。
class Fu { public void method (){ } } class Zi extends Fu { public void method() throws Exception { }//錯誤的方式 }
十、異常中常用方法
在Throwable類中為我們提供了很多操作異常對象的方法,常用的如下:
1.getMessage方法:返回該異常的詳細信息字符串,即異常提示信息
2. toString方法:返回該異常的名稱與詳細信息字符串
3. printStackTrace:在控制台輸出該異常的名稱與詳細信息字符串、異常出現的代碼位置
十一、自定義類異常
格式:
Class 異常名 extends Exception{ //或繼承RuntimeException public 異常名(){ } public 異常名(String s){ super(s); } }
自定義異常繼承Exception演示:
class MyException extends Exception{ /* 為什么要定義構造函數,因為看到Java中的異常描述類中有提供對異常對象的初始化方法。 */ public MyException(){ super(); } public MyException(String message) { super(message);// 如果自定義異常需要異常信息,可以通過調用父類的帶有字符串參數的構造函數即可。 } }
自定義異常繼承RuntimeException演示:
class MyException extends RuntimeException{ /* 為什么要定義構造函數,因為看到Java中的異常描述類中有提供對異常對象的初始化方法。 */ MyException(){ super(); } MyException(String message) { super(message);// 如果自定義異常需要異常信息,可以通過調用父類的帶有字符串參數的構造函數即可。 } }
實例代碼:
throw,throws,try/catch的使用
package com.oracle.Demo01; public class Demo01 { //try/catch格式: 用來處理異常 // try{ // 被檢測的代碼(可能出現異常的代碼) // }catch(異常類名 變量){ // 異常的處理方式 // }finally{ // 必須要執行的代碼 // } public static void main(String[] args) { int[] arr={1,2,3}; try{ int res=getArray(arr); System.out.println(res); }catch(ArrayIndexOutOfBoundsException ex1){ //多catch處理時,平級的沒有先后順序 System.out.println(ex1); //當出現父子類關系式,一定要將子類的放在前面 System.out.println("==========="); System.out.println(ex1.getMessage()); System.out.println("==========="); System.out.println(ex1.toString()); }catch(NullPointerException ex2){ System.out.println(ex2); System.out.println(ex2.getMessage()); System.out.println("==========="); ex2.toString(); }finally{ System.out.println("必須要執行的代碼"); } System.out.println("我執行了嗎"); } //throw跟throws的區別 用來報告異常 //throw 關鍵字后面,必須跟異常對象 // throws 關鍵字后面,必須跟異常類名 用來將異常傳給調用者 public static int getArray(int[] arr) throws ArrayIndexOutOfBoundsException,NullPointerException{ if(arr==null){ throw new NullPointerException("數組為空o(╯□╰)o"); } if(arr.length<4){ throw new ArrayIndexOutOfBoundsException("數組長度不夠(キ`゚Д゚´)!!"); } int i=arr[3]*2; System.out.println("aaa"); return i; } }