1. 程式人生 > >java之異常捕獲及處理

java之異常捕獲及處理

一、處理異常

try{
//有可能出異常的語句 
} [catch (異常型別 物件) {
//異常處理
} catch (異常型別 物件) {
//異常處理
} catch (異常型別 物件) {
//異常處理
}...] [finally {
//不管是否出現異常,都執行的程式碼
}

1、printStackTrace()方法:進行異常資訊輸出

public class Main {

    public static void main(String[] args) {
        System.out.println("11");
        try {
            System.out
.println(10 / 0); } catch (ArithmeticException e) { e.printStackTrace(); } finally { System.out.println("11123"); } }

注意事項:在try出錯語句之後的語句不再執行

public class Main {

    public static void main(String[] args) {
        System.out.println("11");
        try
{ System.out.println(10 / 0); // 在try出錯語句之後的語句,不再執行了 System.out.println("!!"); } catch (ArithmeticException e) { System.out.println("出錯了"); } finally { System.out.println("11123"); } } }

輸出結果:
11
出錯了
11123

二、Error和Exception的區別
Error:指的是JVM的錯誤,此時程式還沒有執行,使用者無法處理的異常
Exception:程式執行中產生的異常,使用者可以處理,我們一般說的處理異常就是指的Exception類以及他的子類的異常

三、java中處理異常的流程
1、程式執行出現異常時,JVM會自動根據異常的型別例項化一個與之匹配的異常類物件(此時使用者不用去關心new,由系統自動負責處理)
2、產生異常物件後,會判斷當前語句上是否存在有異常處理,如果沒有,就交給JVM進行預設處理,處理的方式:輸出異常資訊,而後結束程式呼叫
3、如果此時存在異常的捕獲操作,那麼會由try語句來捕獲產生的異常類例項化物件,而後與try語句後的每一個catch進行比較,如果有符合的catch捕獲型別,則使用當前catch語句進行異常處理,如果不匹配則向下繼續匹配catch
4、 不管最後異常處理 是否能匹配,那麼都要向後執行,如果此時存在finally語句,那麼先執行finally中的程式碼,但是執行完畢後需要根據之前catch匹配結果來決定如何執行,如果之前已經成功捕獲了異常,那麼就繼續執行fianlly之後的程式碼,如果沒有捕獲成功,那麼就將此異常交給JVM進行預設處理

四、兩點說明
1、在編寫多個catch捕獲異常的時候,捕獲範圍大的異常一定要放在捕獲範圍小的異常之後,否則程式編譯錯誤
2、雖然直接捕獲Exception比較方便,但是這樣也不好,因為所有的異常都會按照同樣一種方式處理,如果在一些要求嚴格的專案裡面,異常一定要分開處理比較好

五、throws關鍵字
主要用於方法宣告上,指的是當方法之中出現異常後交由被呼叫處處理,呼叫處不管是都出現異常,都要用try catch進行異常的處理

public class Main {
    // 存在throws,表示該方法產生的異常,交給被呼叫處使用
    public static int t(int x, int y) throws Exception {
        return x / y;
    }

    public static void main(String[] args) {
        // 不管對與錯,都要使用try catch進行處理
        try {
            System.out.println(t(10, 2));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

注意:不要在主方法中加上throws,因為加上後異常會拋給JVM進行預設處理

六、throw關鍵字
在程式之中,可以直接手工的丟擲一個異常類的例項化物件

public class Main {
    public static void main(String[] args) {
        try {
            throw new Exception("自己定義的異常");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

六、throw和throws的區別
throw:指的是在方法中人為丟擲一個異常類物件(這個異常類物件可能是自己例項化或者 是丟擲已存在的)
throws:在方法的宣告上使用,表示此方法在呼叫時必須處理異常

七、異常的使用格式

public class Main {
    public static int t(int x, int y) throws Exception {
        int result = 0;
        try {
            result = x / y;
        } catch (Exception e) {
            throw e;// 繼續向上拋異常,拋給main方法的try catch進行異常輸出
        } finally {

            System.out.println("kkkk");
        }
        return result;

    }

    public static void main(String[] args) {
        try {
            System.out.println(t(10, 0));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("fianlly");
        }
    }
}

縮寫:try…finally

public class Main {
    public static int t(int x, int y) throws Exception {
        int result = 0;
        try {
            result = x / y;
        } finally {

            System.out.println("kkkk");
        }
        return result;

    }

    public static void main(String[] args) {
        try {
            System.out.println(t(10, 0));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("fianlly");
        }
    }
}

八、RuntimeException類
執行時異常,這種異常類最大特徵在於:程式在編譯的時候,不會強制性的要求使用者處理異常,使用者可以根據自己的需要選擇性處理,但是如果沒有處理又發生異常了,就會交給JVM預設處理,也就是說RuntimeException的子異常類,可以由使用者根據需要選擇進行處理

Exception與RuntimeException的區別:
Exception是RuntimeException的父類,使用exception定義的異常必須要被處理,而RuntimeException的異常可以選擇性處理
常見的RuntimeException異常:ArithmeticException,NullPointerException,ClassCastException

九、斷言–assert關鍵字
在java中斷言指的是程式執行到某行程式碼處時一定是預期的結果,預設情況下,斷言是不應該影響程式的執行的,也就是說在java編譯程式的時候,斷言是不起作用的

public class Main {
    public static void main(String[] args) {
        int num = 10;
        //假設期望num是20
        assert num == 20 : "num的內容不是20";
        System.out.println("num=" + num);
    }
}

輸出結果:10 (不報錯)
啟用斷言:java-ea 類名

十、自定義異常
java中已經提供了很多異常,但是在實際中異常往往不夠用,因此需要自定義一個異常類,如果想要自定義一個異常類,可以選擇繼承Exception類或者是RuntimeException類

class addException extends Exception {
    public addException(String msg) {
        super(msg);
    }
}

public class Main {
    public static void main(String[] args) {
        int num = 20;
        try {
            if (num > 10) {
                throw new addException("數值傳遞過大");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

報錯.addException: 數值傳遞過大
at 報錯.Main.main(Main.java:11)