Error:java
虛擬機沒法解決的嚴重問題。JVM
系統內部錯誤、資源耗盡等嚴重狀況。
好比:StackOverflowError
,通常不編寫針對性的代碼進行處理。java
Exception:其它因編程錯誤或偶然的外在因素致使的通常性問題,可使用針對性的代碼進行處理。
好比:空指針訪問、試圖讀取不存在的文件、網絡連接中斷、數組角標越界。數據庫
java.lang.Throwable
:
|-------java.lang.Error
:通常不編寫針對性的代碼進行處理。編程
java.lang.Exception
:可進行異常的處理
checkd
)
IOException
FIleNotFoundException
:文件找不到異常ClassNotFoundException
:類找不到異常uncheckd
,RuntimeException
)
NullPointerException
:空指針異常ArrarIndexOutOfBoundsException
:數組下標越界異常ClassCastException
:數據類型轉換異常NumberFormatException
:數字格式化異常InputMismatchException
:輸入類型與獲取類型不匹配異常ArithmeticException
:算術異常// ************************編譯時異常************************ // FIleNotFoundException @Test public void test7() { File file = new File("hello.txt"); FileInputStream fis = new FileInputStream(file); int data = fis.read(); while(data != -1) { System.out.println((char)data); data = fis.read(); } fis.close(); } // ************************運行時異常************************ // ArithmeticException @Test public void test6() { int a = 5; int b = 0; System.out.println(a / b); } // InputMismatchException @Test public void test5() { Scanner scanner = new Scanner(System.in); int nextInt = scanner.nextInt(); System.out.println(nextInt); } // NumberFormatException @Test public void test4() { String str = "abc"; int num = Integer.parseInt(str); } // ClassCastException @Test public void test3() { Object obj = new Date(); String str = (String)obj; } // IndexOutOfBoundsException @Test public void test2() { //ArrayIndexOutOfBoundsException int[] arr = new int[5]; System.out.println(arr[5]); //StringIndexOutOfBoundsException String str = "abc"; System.out.println(str.charAt(3)); } // NullPointerException @Test public void test1() { String str = "abc"; str = null; System.out.println(str.charAt(0)); }
異常的處理:抓拋模型數組
過程一"拋":程序在正常執行的過程當中,一旦出現異常,就會在異常代碼出生成一個對應異常類的對象。並將此對象拋出,一旦拋出對象,以後的代碼就再也不執行。網絡
關於異常對象的產生:
① 系統自動生成的異常對象。
② 手動的生成一個異常對象,並拋出(throw
)。指針
過程二"抓":能夠理解爲異常的處理方式(try-catch-finally
、throws
)。code
try{ //可能出現異常的代碼 }catch(異常類型1 變量名1){ //處理異常的方法1 }catch(異常類型2 變量名2){ //處理異常的方法2 }... finally{ //必定會執行的代碼 }
1)使用try
將可能出現異常的代碼包裝起來,在執行過程當中,一旦出現異常,就會生成一個對應異常類的對象,根據此對象的類型,去catch
中匹配。orm
2)一旦try
中的異常對象匹配到某一個catch
時,就進入catch
中進行異常處理。一旦處理完成,就跳出當前的try-catch
結構(在沒有finally
的狀況),繼續執行其後的代碼。對象
3)catch
中的異常類型若是沒有子父關係,則誰聲明在上,誰聲明在下無所謂。catch
中的異常類型若是知足子父類關係,則要求類必定聲明在父類的上面,不然,報錯。繼承
4)經常使用的異常處理方式:
String getMessage()
printStackTrace()
5)在try
結構中聲明的變量只能在內部使用,出了try
結構之後,就不能在被調用。
體會:使用
try-catch-finally
處理編譯時異常,只得程序在編譯時就再也不報錯,可是運行> 時仍可能報錯。至關於咱們使用try-catch-finally
將一個編譯時可能出現的異常,延遲到> 運行時出現。體會2:開發中,因爲運行時異常比較常見,因此咱們一般就不針對運行時異常編寫
try-catch-finally
了。針對一編譯時異常,咱們必定要考慮異常的處理。
1)finally
是可選的
2)finally
中聲明的是一旦會執行的代碼。即便catch
中又出現異常了,try
中的return
語句、catch
中有return
語句等狀況。
3)像數據庫連接、輸入輸出流、網絡編程Socket
等資源,JVM
是不能自動回收的,咱們須要本身手動的進行資源的釋放。此時資源釋放,就須要聲明在finally
中。
"throws
+ 異常的類型"寫在方法的聲明處。指明此方法執行時,可能會拋出的異常類型。當方法執行時,出現異常,仍會在異常代碼處生成一個異常類的對象,此對象知足throws
後異常類型時,就會被拋出。異常的後續代碼將再也不執行。
體會:
try-catch-finally
:真正的將異常給處理掉了。
throws
的方式只是將異常拋給了方法的調用者。並無真正將異常處理掉。
開發中如何選擇使用try-catch-finally
仍是使用throws?
1、若是父類中被重寫的方法沒有throws
方式處理異常,則子類重寫的方法也不能使用throws
,意味着若是子類重寫的方法中有異常,必須使用try-catch-finally
方式處理。
2、執行的方法中,前後又調用了另外幾個方法,這幾個方法時遞進關係執行的。建議這幾個方法使用throws
的方式進行處理。而執行的方法A
能夠考慮使用tyr-catch-finally
方式進行處理。
1、繼承於現有的異常結構:運行時異常(RuntimeException
)、編譯時異常(Exception
)
2、提供全局常量:serialVersionUID
3、重載幾個構造器
具體的自定義異常類,以後補上