總網頁瀏覽量

2012年5月24日 星期四

JAVA 異常


異常: 程序在運行時出現不正常情況
分為兩種:
嚴重: java通過Error類別進行描述
非嚴重: java通過Exception處理

Throwable類別: 子類為ErrorException
Exception在運行時運行出現的情況,可以通過try catch finally處理

編譯時異常: 必須throws,並讓調用者try and catch
非編譯時異常: RuntimeException及其子類

方法:
getMessage()獲取異常資訊,返回字串
toString()獲取異常類名和異常資訊,返回字串
printStackTrace()獲取異常類名和異常資訊,以及異常出現在程式中的位元置。返回值void
printStackTrace(PrintStream s)通常用該方法將異常內容保存在日誌檔中,以便查閱

異常的處理:
try{
需要檢測的代碼;
}catch(異常類 變數){
異常處理代碼;  //處理方式
}finally{
一定會執行的代碼;
}
Finally代碼塊只有一種情況不會被執行。就是在之前執行了System.exit(0)
通過構造函式定義異常資訊。

ex:
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說明此函數可能出現異常,必須定義補捉或聲明


throwsthrow的區別:
thorws用在函數上,後面跟異常類名,可以拋出多個,以逗號區分
throw用在函數內,後面跟異常物件,用於拋出異常物件

當函數內有throw拋出異常對象,並未進行try處理時,必須要在函數上聲明,否則編譯失敗,只有RuntimeException例外。如果函數有聲明異常時,調用者需要進行處理,可以throwstry

通過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();
                     }
           }
}


ex: RuntimeException
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);
           }
}

ArthmeticExceptionRuntimeException的子類,RuntimeException運行時異常,這種異常可以不用聲明,且調用者也不需處理,編譯後可執行。表示系統希望這類異常要直接終止,不需處理。

異常在繼承運用時:
子類拋出的異常必須是父類的異常的子類或子集
如果父類或者介面沒有異常拋出時,子類覆寫出現異常時,只能try不能拋出

沒有留言:

張貼留言