1. 程式人生 > >java語言入門 (四)異常處理 (1)

java語言入門 (四)異常處理 (1)

本篇知識目標

1.0 瞭解異常繼承層次及常見的系統異常
2.0 瞭解使用者定義異常的要求
3.0 掌握try{…..}catch(.. ..){….}finally{….} 的使用
掌握throw 與throws 的差異

據說當你百分之80的時間都在處理這些異常的時候你就是大師了

1.0 異常的概念

1.1 什麼是異常

異常指的是程式執行時出現的非正常情況

例如除數是0 陣列大小是10 你訪問的確實第11個元素等

異常處理的特點是對可能出現的異常程式碼段進行try嘗試,如果出現異常,則用catch將其捕獲並且處理。

1.2 異常的類層次

最高層次的類

T0 Throwable

T1 Error Exception //這兩個類都繼承T0的這個類

T2 …….. //這裡有很多的異常 都繼承 T1 中的某個類

Error是JVM 系統內部錯誤我們自己編寫的程式無法處理

Exception 是我們寫的程式的問題 可以處理

有的異常例如IOException 系統會提示我們必須對他可能的異常進行處理,否則編譯不通過

1.3 系統定義的異常

Exception 有很多類 每個類代表一種特定的執行時的錯誤,這些類中有的是系統定義好的並且封裝在java類庫中的,稱為系統定義的執行異常如下詳細查詢api文件

系統定義的異常 異常的解釋
ClassNotFoundException 沒有找到要裝載的類
ArrayIndexOutOfBoundsException 陣列訪問越界
FileNotFoundException 檔案找不到
IOexception 輸入輸出錯誤
NullPointerException 空指標訪問
ArithmeticException 除數為0 算數運算錯誤
NumberFormatException 數字格式錯誤
InterruptedException 中斷異常

2.0異常的處理結構

下面是異常處理語句的格式(jdk 1.7以上還有別的寫法 這麼寫依然對)

try{
    語句塊
}catch(異常型別名  引數名){
    語句塊

}finally{
    語句塊
}

幾點說明:
1. 可能會產生異常的語句塊在try中 一個try可以引導多個catch
2. 異常發生後try後面的語句將不會被執行
3. catch裡的語句塊會執行的標識是 try中會發生異常,並且異常型別與catch(異常型別名 引數名)
中的異常型別一致,則相應的catch內的語句就會執行
4. finally可以沒有 但是如果有的話 無論是否發生異常,他都會執行,除非遇到System.exit(0)

下面我們來看例子

package exception;

public class exceptiona {
            void setException(Object size){
                int arr[] = {1,2,3,4,5};//數字大小是5
                try{
                    int sizea = (int)size;
                    int s = sizea+1;
                    System.out.println("第"+s+"個數組的值是"+arr[sizea]);
                    System.out.println("如果上面沒有異常  那麼這句話會被執行");
                }catch(ArrayIndexOutOfBoundsException ex ){
                    System.out.println("陣列越界了 老鐵"+ex);
                }catch(ClassCastException es){
                    System.out.println("老鐵格式錯誤了");
                }catch(Exception a) {//exception 是所有異常的父類  可以接受任何異常 
                                        // 如果其他catch
                                        //  捕獲的異常型別沒有  則會執行這個異常
                    System.out.println("異常名字是"+a);
                }finally{
                    System.out.println("finally可以有  也可以沒有  有的話一定會被執行");
                }
            }

            public static void main(String[] args) {
                exceptiona exceptiona = new exceptiona();
                exceptiona.setException(10);
            }
}

結果
這裡寫圖片描述

如果把exceptiona.setException(10); 中的10 變為 2

結果:
這裡寫圖片描述

如果把如果把exceptiona.setException(10); 10變為”12” 也及時字串(因為Object 是任何型別的父類 所以可以接受字串)

結果
這裡寫圖片描述

3.0 自定義異常

我們自己定義的話 要注意要繼承Exception類,一般包括構造方法 異常標識,toString方法

package exception;

public class MyException extends Exception{
    String id; //異常的標識
    public MyException(String id){
        this.id = id;
    }
    public String toString(){
        return "異常是"+id;
    }

    public static void main(String[] args) {
        //捕獲自己的異常
        try{
            throw new MyException("沒事拋著玩");
        }catch (MyException e) {
            System.out.println(e);
        }
    }
}


結果:
異常是沒事拋著玩

這裡注意自己定義的異常只能用 throw丟擲 才會被catch捕獲 切catch的異常型別應該是自己定義的型別
下面我們說另一個關鍵字 throws 他的意思是 這個方法不處理 留給呼叫這個函式的方法處理

我在做這個自定義測試的時候 用的jdk1.8的時候 報錯 是通過更換jdk版本解決 換低版本的就ok

package exception;

public class exceptiona {
    void setException(Object size) throws ArrayIndexOutOfBoundsException{//在這丟擲異常

                int arr[] = {1,2,3,4,5};//數字大小是5
                int sizea = (int)size;
                int s = sizea+1;
                System.out.println("第"+s+"個數組的值是"+arr[sizea]);
                System.out.println("如果上面沒有異常  那麼這句話會被執行");
//              try{
//                  
//              }catch(ArrayIndexOutOfBoundsException ex ){
//                  System.out.println("陣列越界了 老鐵"+ex);
//              }catch(ClassCastException es){
//                  System.out.println("老鐵格式錯誤了");
//              }catch(Exception a) {//exception 是所有異常的父類  可以接受任何異常  如果其他catch
//                                      //  捕獲的異常型別沒有  則會執行這個異常
//                  System.out.println("異常名字是"+a);
//              }finally{
//                  System.out.println("finally可以有  也可以沒有  有的話一定會被執行");
//              }
            }

            public static void main(String[] args) {
                exceptiona exceptiona = new exceptiona();
                //上個函式丟擲的異常 會在這處理  如果不處理 可以在這個方法裡接著丟擲被jvm處理
                try {
                    exceptiona.setException(12);
                } catch (ArrayIndexOutOfBoundsException ex) {
                    System.out.println("陣列越界了 老鐵"+ex);
                }
            }
}

結果:
這裡寫圖片描述

package exception;

public class exceptiona {
            void setException(Object size) throws ArrayIndexOutOfBoundsException{
                int arr[] = {1,2,3,4,5};//數字大小是5
                int sizea = (int)size;
                int s = sizea+1;
                System.out.println("第"+s+"個數組的值是"+arr[sizea]);
                System.out.println("如果上面沒有異常  那麼這句話會被執行");
//              try{
//                  
//              }catch(ArrayIndexOutOfBoundsException ex ){
//                  System.out.println("陣列越界了 老鐵"+ex);
//              }catch(ClassCastException es){
//                  System.out.println("老鐵格式錯誤了");
//              }catch(Exception a) {//exception 是所有異常的父類  可以接受任何異常  如果其他catch
//                                      //  捕獲的異常型別沒有  則會執行這個異常
//                  System.out.println("異常名字是"+a);
//              }finally{
//                  System.out.println("finally可以有  也可以沒有  有的話一定會被執行");
//              }
            }
    //這個函式不處理  交給JVM處理
            public static void main(String[] args) throws ArrayIndexOutOfBoundsException{
                exceptiona exceptiona = new exceptiona();

                    exceptiona.setException(12);

            }
}

結果
這裡寫圖片描述

歡迎評論 交流