1 異常概述 2 異常體系 3 異常的原理 4 異常對象的拋出 5 自定義異常&異常類的拋出(throws) 6 異常的分類 7 throw和throws的區別? 8 異常的捕獲 9 異常處理的原則 10 異常的註意事項 ...
1 異常概述
- 異常是在運行期間發生的不正常的情況。
- 在java中,用類的形式對不正常的情況進行了描述和封裝對象,描述不正常情況的類稱為異常類。
- 以前正常流程代碼和問題代碼相結合,現在將正常流程代碼和問題處理代碼分離,提高了閱讀性。
- 其實,異常就是java通過面向對象的思想將問題封裝成對象。
2 異常體系
- 異常體系,就是異常很多,描述異常的類也很多,將其共性進行了抽取,就形成了體系。
- 異常體繫結構圖如下所示:
- Throwable:無論是Error還是Exception,一般發生問題就應該可以拋出,讓調用者知道並處理。該體系的特點就在於Throwable及其所有的子類都具有可拋性。其實就是通過throws和throw兩個關鍵字體現的,凡是被這兩個關鍵字所操作的類和對象都具有可拋性。
- Error:是由JVM拋出的嚴重性問題。這種問題一旦發生一般不針對性處理。
- Exception:可以處理。
3 異常的原理
- 示例:
package java011; /** * 2017/9/15 * 說明: */ class Demo{ public void method(int[] arr,int index){ System.out.println(arr[index]); } } public class ExceptionDemo { public static void main(String[] args) { int[] arr = new int[3]; Demo d = new Demo(); d.method(arr,3); } }
4 異常對象的拋出
- 示例:
package java011; /** * 2017/9/15 * 說明: */ class Demo{ public int method(int[] arr,int index){ if(index<0){ throw new RuntimeException("索引不能小於0"); } if(arr == null || arr.length <=0){ throw new RuntimeException("數組為空或者數組的長度為0"); } if(arr.length <=index){ throw new ArrayIndexOutOfBoundsException("數組越界"+index); } return arr[index]; } } public class ExceptionDemo { public static void main(String[] args) { int[] arr = new int[3]; Demo d = new Demo(); int result = d.method(arr,3); System.out.println("結果是:"+result); } }
5 自定義異常&異常類的拋出(throws)
package java011; /** * 2017/9/15 * 說明: */ /** * 負數角標異常 */ class FuShuIndexException extends Exception{ public FuShuIndexException(String str){ super(str); } } class Demo{ public int method(int[] arr,int index) throws FuShuIndexException { if(index<0){ throw new FuShuIndexException("索引不能小於0"); } if(arr == null || arr.length <=0){ throw new RuntimeException("數組為空或者數組的長度為0"); } if(arr.length <=index){ throw new ArrayIndexOutOfBoundsException("數組越界"+index); } return arr[index]; } } public class ExceptionDemo { public static void main(String[] args) throws FuShuIndexException { int[] arr = new int[3]; Demo d = new Demo(); int result = d.method(arr,3); System.out.println("結果是:"+result); } }
6 異常的分類
- 異常的分類
- ①編譯時被檢測異常:只要Exception和其子類都是,除了RuntimException體系。這種問題一旦出現,希望在編譯的時候就進行檢測,讓這種問題有對應的處理方式。這樣的問題都可以針對性的處理。
- ②運行時異常:RuntimeException體系。這種問題的發生,無法讓功能繼續,運算無法進行,更多是因為調用者的原因導致的或者內部狀態的改變導致的。這樣的問題一般不針對性處理,直接編譯通過,運行時,讓調用者調用的程式強制停止。
7 throw和throws的區別?
- ①throw使用在函數上,throw使用在函數內。
- ②throws拋出的是異常類,可以拋出多個,用逗號隔開。throw拋出的異常對象。
8 異常的捕獲
- 異常捕獲的方式
try{ }catch(異常類 變數){ }finally{ }
- 示例:
package java011; /** * 2017/9/15 * 說明: */ /** * 負數角標異常 */ class FuShuIndexException extends Exception{ public FuShuIndexException(String str){ super(str); } } class Demo{ public int method(int[] arr,int index) throws FuShuIndexException { if(index<0){ throw new FuShuIndexException("索引不能小於0"); } if(arr == null || arr.length <=0){ throw new RuntimeException("數組為空或者數組的長度為0"); } if(arr.length <=index){ throw new ArrayIndexOutOfBoundsException("數組越界"+index); } return arr[index]; } } public class ExceptionDemo { public static void main(String[] args) { int[] arr = new int[3]; Demo d = new Demo(); int result = 0; try { result = d.method(arr,3); } catch (FuShuIndexException e) { e.printStackTrace(); } System.out.println("結果是:"+result); } }
9 異常處理的原則
- ①函數內部如果拋出需要檢測的異常,那麼函數上必須聲明。不然,必須在函數內部捕獲,如果又不聲明,又不捕獲,那麼會編譯失敗。
- ②如果調用到了聲明異常的函數,要麼捕獲要麼throws,否則編譯失敗。
- ③如果功能內容可以解決的,用catch,解決不了的,用throws告訴調用者,由調用者解決。
- ④一個如果功能如果拋出了多個異常,那麼調用的時候必須有對應的多個catch進行針對性的處理或直接catch(Exception e)。
10 異常的註意事項
- 子類在覆蓋父類方法的時候,父類的方法如果拋出了異常,那麼子類的方法只能拋出父類的異常或者該異常的子類。
- 如果父類拋出多個異常,那麼子類只能拋出父類異常的子集。