若是是以Exception結尾的,那麼確定就是一個異常。html
異常的處理:
方式一:捕獲處理(往下面還有方式二)
捕獲處理的格式:
try{
可能發生異常的代碼;
}catch(捕獲的異常類型 變量名){
處理異常的代碼....
}
java
捕獲處理要注意的細節:
1.code1中體現→若是try塊中代碼出了異常通過了處理以後,那麼try-catch塊外面的代碼能夠正常執行。
2.code2中體現→若是try塊中出了異常的代碼,那麼在try塊中出現異常代碼後面的代碼是不會執行了。
3.code3中體現→一個try塊後面是能夠跟有多個catch塊的,也就是一個try塊能夠捕獲多種異常的類型。
4.code4中體現→一個try塊能夠捕獲多種異常的類型,可是捕獲的異常類型必須從小到大進行捕獲,不然編譯報錯。jvm
code1spa
package day10; public class TestException2 { public static void main(String[] args){ test(1,0); } public static void test(int a , int b){ try{ int c = a/b; }catch (ArithmeticException e){ System.out.println("異常處理了 並返回當前異常對象的完整類名+病態信息 :"+e.toString()); } System.out.println("try-catch塊外面的代碼能夠正常執行中"); } }運行結果:
異常處理了 回當前異常對象的完整類名+病態信息 :java.lang.ArithmeticException: / by zero
try-catch塊外面的代碼能夠正常執行中
指針
code2code
package day10; public class TestException2 { public static void main(String[] args){ test(1,0); } public static void test(int a , int b){ try{ int c = a/b; System.out.println("看看是否被執行到~"); }catch (ArithmeticException e){ System.out.println("異常處理了 並返回當前異常對象的完整類名+病態信息 :"+e.toString()); } } }運行結果:
異常處理了 並返回回當前異常對象的完整類名+病態信息 :java.lang.ArithmeticException: / by zero
htm
」看看是否被執行到~「 這句沒有被執行到,由於int c = a/b;這句出現異常了,因此try塊內的其他代碼都不會執行,直接會被catch 處理掉。對象
code3it
public class TestException2 { public static void main(String[] args){ int[] arr = null; test(10,2,arr); } public static void test(int a , int b, int[] arr) { int c = 0 ; try{ c = a/b; System.out.println(arr.length); }catch (ArithmeticException e){ System.out.println("異常處理了 並返回回當前異常對象的完整類名+病態信息 :"+e.toString()); }catch (NullPointerException e){ System.out.println("出現了空指針異常...."); }catch (Exception e){ System.out.println("cc"); } System.out.println("c="+c); } }
運行結果:io
出現了空指針異常....
c=5
code3這段代碼要注意,try塊能檢測多種異常,可是隻能處理一種異常,就是第一個異常。
code4
public class TestException2 { public static void main(String[] args){ int[] arr = null; test(10,2,arr); } public static void test(int a , int b, int[] arr) { int c = 0 ; try{ c = a/b; System.out.println(arr.length); }catch (Exception e){ System.out.println("Exception類來捕獲的話,其餘類就捕獲不了,至關於父類把工做都作完了,還有子類的事嗎?"); }catch (NullPointerException e){ System.out.println("出現了空指針異常...."); }catch (ArithmeticException e){ System.out.println("cc"); } System.out.println("c="+c); } }
運行結果:
Exception 把 NullPointerException 和 ArithmeticException 的異常都捕獲處理了,因此會提示錯誤,必須從小到大進行捕獲,不然編譯報錯
方式二:異常的處理方式----拋出處理
拋出處理要注意的細節:
1.code5中體現→ 若是一個方法的內部拋出了一個異常 對象,那麼必需要在方法上聲明拋出。
2.code6中體現→若是調用了一個聲明拋出異常 的方法,那麼調用者必需要處理異常。
3.code7中體現→若是一個方法內部拋出了一個異常對象,那麼throw語句後面的代碼都不會再執行了(一個方法遇到了throw關鍵字,該方法也會立刻中止執行的)。
4.code8中體現→在一種狀況下,只能拋出一種類型異常對象。(意思就是if())
throw 與throws兩個關鍵字:
1. throw關鍵字是用於方法內部的,throws是用於方法聲聲明上的。
2. throw關鍵字是用於方法內部拋出一個異常對象的,throws關鍵字是用於在方法聲明上聲明拋出異常類型的。
3. throw關鍵字後面只能有一個異常對象,throws後面一次能夠聲明拋出多種類型的 異常
概念
※Exception在程序中必須使用try...catch進行處理。
※RuntimeException能夠不使用try...catch進行處理,可是若是有異常產生,則異常將由JVM進行處理(默認往上拋)
code5
public class TestException2 { public static void main(String[] args){ try{ int[] arr = null; test(10,2,arr); }catch(NullPointerException e){ System.out.println("報告! 有異常出現"); e.printStackTrace(); } } public static void test(int a , int b, int[] arr) throws ArithmeticException,NullPointerException{ int c = 0 ; if(b==0){ throw new ArithmeticException(); //拋出一個異常對象... }else if(arr==null){ throw new NullPointerException(); } c = a/b; System.out.println(arr.length); System.out.println("c="+c); } }
運行結果:
報告! 有異常出現
java.lang.NullPointerException
at day10.TestException2.test(TestException2.java:22)
at day10.TestException2.main(TestException2.java:10)
code6
public class TestException2 { public static void main(String[] args) { //try{ int[] arr = null; test(4,0,arr); //調用了一個 聲明拋出異常類型 的方法 //}catch(Exception e){ System.out.println("報告! 異常出現了"); // e.printStackTrace(); //} } public static void test(int a , int b, int[] arr) throws Exception,NullPointerException{ int c = 0 ; if(b==0){ throw new Exception(); //拋出一個異常對象... }else if(arr==null){ throw new NullPointerException(); } c = a/b; System.out.println(arr.length); System.out.println("c="+c); } }
運行結果:
P.S.
這code6中的代碼 ,必定要注意 在test方法拋出的若是是RuntimeException類的話 ,就是不捕獲也不會提示報錯的,由於異常分爲檢查性異常和運行時異常 檢查性異常須要捕捉,運行時異常不會強制要求捕捉,也就是說非RuntimeException 包括Eception 都是須要捕獲
code7
public class TestException2 { public static void main(String[] args) { try{ int[] arr = null; test(4,0,arr); //調用了一個 聲明拋出異常類型 的方法 }catch(Exception e){ System.out.println("報告! 異常出現了"); e.printStackTrace(); } } public static void test(int a , int b, int[] arr) throws Exception,NullPointerException{ int c = 0 ; if(b==0){ throw new Exception(); //拋出一個異常對象... }else if(arr==null){ throw new NullPointerException(); } c = a/b; System.out.println(arr.length); System.out.println("c="+c); } }運行結果:
報告! 異常出現了
java.lang.Exception
at day10.TestException2.test(TestException2.java:21)
at day10.TestException2.main(TestException2.java:11)
可見C的值沒有打印出來,因此一拋出異常 後面的代碼都不執行了。
code8
class Demo11 { public static void main(String[] args) { try{ int[] arr = null; div(10,0,arr); //調用了一個 聲明拋出異常類型 的方法 }catch(Exception e){ System.out.println("報告! 出現異常了"); e.printStackTrace(); } } public static void div(int a, int b,int[] arr) throws Exception,NullPointerException { if(b==0 || arr==null){ throw new Exception(); //拋出一個異常對象... throw new NullPointerException(); } int c = a/b; System.out.println("c="+c); } }運行結果:
由於拋出了異常 就不會處理下面的語句了,方法都結束了 ,因此只能將2個異常分開成兩種狀況 才能避免編譯時錯誤。
if(b==0){ throw new Exception(); //拋出一個異常對象... }else if(arr==null){ throw new NullPointerException(); }
交流企鵝:654249738,和自學者交流羣:517284938