1. 程式人生 > >java se基礎--異常處理

java se基礎--異常處理

三.異常處理

1.體系結構

         java.lang.Object

                   |-----java.lang.Throwable

                                     |-------java.lang.Error:錯誤,java程式對此無能為力,不顯式的處理

                                     |-------java.lang.Exception:異常,需要進行處理

                                               |-------RuntimeException:執行時異常

                                                        |-------ArrayIndexOutOfBoundsException/NullPointerException

                                                                           /ArithmeticException/ClassCastException

                                               |-------非RuntimeException:編譯時異常

2.因為java程式分為javac.exe和java.exe兩個過程,在每個過程中,都有可能出現異常.故分為編譯時異常、執行時異常

         2.1對於執行時異常比較常見,可以不顯示的來處理

         2.2對於編譯時異常,必須要顯式的處理

                   編譯時異常,不是說有異常才處理,而是存在異常的隱患,必須在編譯前,提示程式,萬一出現異常,如何處理!

3.如何處理異常?

         java中的"抓拋模型"

                   1)"拋":當我們執行程式碼時,一旦出現異常,就會在異常的程式碼處生成一個對應的異常型別的物件,並

         將此物件丟擲。(自動丟擲/ 手動丟擲

)

         >一旦丟擲此異常類的物件,那麼程式就終止執行

         >此異常類的物件拋給方法的呼叫者。

                 2)."抓":抓住上一步丟擲來的異常類的物件。如何抓?即為異常處理的方式

     java 提供了兩種方式用來處理一個異常類的物件。

     處理的方式一:

     try{

            //可能出現異常的程式碼

     }catch(Exception1 e1){

            //處理的方式1

     }catch(Exception2 e2){

            //處理的方式2

     }finally{

            //一定要執行的程式碼

     }

  注:1.try內宣告的變數,類似於區域性變數,出了try{}語句,就不能被呼叫

     2.finally是可選的。

     3.catch語句內部是對異常物件的處理:

         >getMessage();  printStackTrace();

     4.可以有多個catch語句,try中丟擲的異常類物件從上往下去匹配catch中的異常類的型別,一旦滿足

       就執行catch中的程式碼。執行完,就跳出其後的多條catch語句

     5.如果異常處理了,那麼其後的程式碼繼續執行。

     6.若catch中多個異常型別是"並列"關係,孰上孰下都可以。

       若catch中多個異常型別是"包含"關係,須將子類放在父類的上面,進行處理。否則報錯!

     7.finally中存放的是一定會被執行的程式碼,不管try中、catch中是否仍有異常未被處理,以及是否有return語句。

     8.try-catch是可以巢狀的。

處理方式二:

         在方法的宣告處,顯式的使用throws+異常型別

4.對於執行時異常來說,可以不顯式的進行處理。

  對於編譯時異常來說,必須要顯式的進行處理

5.如何自定義一個異常類?

         >手動的丟擲一個異常,除了丟擲的是現成的異常類的之外,還可以丟擲一個自定義的異常類的物件!

         >如何自定義一個異常類呢?

         //1.自定義的異常類繼承現有的異常類

         //2.提供一個序列號,提供幾個過載的構造器

public class MyException extends Exception{

         static final long serialVersionUID = -70348975766939L;

         public MyException(){

         }

         public MyException(String msg){

                   super(msg);

         }

}

6. "5個關鍵字搞定異常處理!"其中,要區分:throw與throws的區別?

   6.1throw是語句丟擲一個異常,一般是在程式碼塊的內部,當程式出現某種邏輯錯誤時由程式設計師主動丟擲某種特定型別的異常

public static void main(String[] args) {   
    String s = "abc";   
    if(s.equals("abc")) {   
      throw new NumberFormatException();   
    } else {   
      System.out.println(s);   
    }   
    //function();   
}  
執行時,系統會丟擲異常:

Exception in thread "main" java.lang.NumberFormatException at......

6.throws是方法可能丟擲異常的宣告。(用在宣告方法時,表示該方法可能要丟擲異常)

public void function() throws Exception{......}

當某個方法可能會丟擲某種異常時用於throws 宣告可能丟擲的異常,然後交給上層呼叫它的方法程式處理

public class testThrows(){  
public static void function() throws NumberFormatException{   
String s = "abc";   
System.out.println(Double.parseDouble(s));   
}   
  
public static void main(String[] args) {   
try {   
function();   
} catch (NumberFormatException e) {   
System.err.println("非資料型別不能強制型別轉換。");   
//e.printStackTrace();   
}   
}  

執行結果:

非資料型別不能強制型別轉換。

throw與throws的比較
1、throws出現在方法函式頭;而throw出現在函式體。
2、throws表示出現異常的一種可能性,並不一定會發生這些異常;throw則是丟擲了異常,執行throw則一定丟擲了某種異常物件。
3、兩者都是消極處理異常的方式(這裡的消極並不是說這種方式不好),只是丟擲或者可能丟擲異常,但是不會由函式去處理異常,真正的處理異常由函式的上層呼叫處理。