JAVA 異常

摘要:JAVA 異常

異常: 程序在運行時出現不正常情況
分為兩種:
嚴重: java通過Error類別進行描述
非嚴重: java通過Exception處理
 
Throwable類別: 子類為Error、Exception
Exception在運行時運行出現的情況,可以通過try catch finally處理
 
編譯時異常: 必須throws,並讓調用者try and catch
非編譯時異常: RuntimeException及其子類
 
方法:
getMessage()獲取異常資訊,返回字串
toString()獲取異常類名和異常資訊,返回字串
printStackTrace()獲取異常類名和異常資訊,以及異常出現在程式中的位元置。返回值void
printStackTrace(PrintStream s)通常用該方法將異常內容保存在日誌檔中,以便查閱
 
異常的處理:
try{
需要檢測的代碼;
}catch(異常類 變數){
異常處理代碼;  //處理方式
}finally{
一定會執行的代碼;
}
Finally代碼塊只有一種情況不會被執行。就是在之前執行了System.exit(0)。
通過構造函式定義異常資訊。
 

try{
        int x = 4/0;
}catch(Exception e){
        System.out.println(e.getMessage());   // by zero
        System.out.println(e.toString());     // java.lang.ArithmeticException: / by zero
        e.printStackTrace();
}

 

輸出:
java.lang.ArithmeticException: / by zero
           at Hello.main(Hello.java:5)
 
throws用於標識函數暴露出的異常
ex:
int div(int a, int b) throws Exceptio
以throws說明此函數可能出現異常,必須定義補捉或聲明
 
 
throws與throw的區別:
thorws用在函數上,後面跟異常類名,可以拋出多個,以逗號區分
throw用在函數內,後面跟異常物件,用於拋出異常物件
 
當函數內有throw拋出異常對象,並未進行try處理時,必須要在函數上聲明,否則編譯失敗,只有RuntimeException例外。如果函數有聲明異常時,調用者需要進行處理,可以throws或try。
 
通過throw將自定義異常拋出。
RuntimeException以及其子類如果在函數中被throw拋出,可以不用在函數上聲明。
一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異常或異常的子類。
如果父類拋出多個異常,那麼覆寫方法必須拋出那些異常的一個子集,不能拋出新的異常。
介紹異常在分層設計時的層內封裝。
 
自定義異常:

class A{
           int div(int a, int b) throws TestException{
                     if(b <= 0)
                                throw new TestException("錯誤訊息");
                     return a/b;
           }
}

 

自定義異常內容:


class TestException extends Exception{
    TestException(String msg){
        super(msg);   //呼叫父類Exception建構子
    }
}

class Hello{
    public static void main(String[] args){
        A a= new A();
        try{
            int x = a.div(1, -1);
        }catch(TestException e){
            e.printStackTrace();
        }
    }
}

class A{
    int div(int a, int b){
        if(b == 0)
            throw new ArithmeticException("除以零");
        return a/b;
    }
}
class Hello{
    public static void main(String[] args){
        A a= new A();
        int x = a.div(1, 0);
    }
}
ArthmeticException為RuntimeException的子類,RuntimeException運行時異常,這種異常可以不用聲明,且調用者也不需處理,編譯後可執行。表示系統希望這類異常要直接終止,不需處理。
 
異常在繼承運用時:
子類拋出的異常必須是父類的異常的子類或子集
如果父類或者介面沒有異常拋出時,子類覆寫出現異常時,只能try不能拋出