Java語言基礎:異常機制 – JAVA編程語言程序開發技術文章

1.  拋出異常


通過throw new ThrowableClass語法可以拋出一個異常,其中ThrowableClass是一個從Throwable繼承的類,或者是Throwable類本身,先看下面的
view plaincopy to clipboardprint?
public void proc(){  
    // Exception是Throwable的繼承類,代表最基本的異常  
    throw new Exception(“hello”);  

public void proc(){
    // Exception是Throwable的繼承類,代表最基本的異常
    throw new Exception(“hello”);
}
 


上面的代碼會導致編譯錯誤,對於有拋出異常的方法,編譯器強制要求:要麼在方法上聲明要拋出的異常(稱為異常說明),要麼在方法中用try塊捕獲這個異常。
view plaincopy to clipboardprint?
// 用異常說明,說明該方法要拋出的異常  
public void proc() throws Exception{  
    throw new Exception(“hello”);  
}  
   
// 用try塊捕獲該異常  
public void proc(){  
    try {  
        throw new Exception(“hello”);  
    } catch (Exception e) {  
        e.printStackTrace();  
    }  

// 用異常說明,說明該方法要拋出的異常
public void proc() throws Exception{
    throw new Exception(“hello”);
}
 
// 用try塊捕獲該異常
public void proc(){
    try {
        throw new Exception(“hello”);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


異常說明可以是方法拋出的異常類本身,也可以是異常類的基類,比如throws後面可以是throwable。


上面說到對於有拋出異常的方法,必須帶有方法聲明,這並不準確,當拋出的異常類是RuntimeException或其繼承類時,不需要異常說明:
view plaincopy to clipboardprint?
// RuntimeException或其繼承類不需要異常聲明  
public void proc(){  
    throw new RuntimeException(“hello”);  

// RuntimeException或其繼承類不需要異常聲明
public void proc(){
    throw new RuntimeException(“hello”);
}


一個方法即使內部沒有拋出異常,也仍然可以帶有異常說明:
view plaincopy to clipboardprint?
public void proc2() throws NullPointerException, FileNotFoundException {  

public void proc2() throws NullPointerException, FileNotFoundException {
}


一個方法若帶有異常說明,則調用它的其他方法也要帶有異常說明,或者要捕獲可能拋出的異常:
view plaincopy to clipboardprint?
class A {  
    public void proc() throws Exception {  
        throw new Exception(“hello”);  
    }      
    // 異常聲明  
    public void proc1() throws Exception {  
        proc();  
    }  
    // 異常聲明,聲明中的類可以是基類  
    public void proc2() throws Throwable {  
        proc();  
    }  
    // 直接捕獲異常  
    public void proc3() {  
        try {  
            proc();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  

class A {
    public void proc() throws Exception {
        throw new Exception(“hello”);
    }   
    // 異常聲明
    public void proc1() throws Exception {
        proc();
    }
    // 異常聲明,聲明中的類可以是基類
    public void proc2() throws Throwable {
        proc();
    }
    // 直接捕獲異常
    public void proc3() {
        try {
            proc();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


可以基於Exception現實自己的異常類:
view plaincopy to clipboardprint?
class MyException1 extends Exception {  
}  
class MyException2 extends Exception {  
}  
class A {  
    public void proc() throws MyException1, MyException2{  
    }  

class MyException1 extends Exception {
}
class MyException2 extends Exception {
}
class A {
    public void proc() throws MyException1, MyException2{
    }
}
 


2.  捕獲異常和結束清理


用try{}塊包圍住可能引發異常的代碼,後面緊跟著異常處理器(即catch(…){}塊);catch塊可以有多個,()中聲明要捕獲的異常類。當try塊拋出一個異常時,執行代碼將跳到catch塊去,並從第一個catch塊開始匹配,直到找到符合的catch塊。請看下面的代碼說明:
view plaincopy to clipboardprint?
class MyException1 extends Exception {  
}  
class MyException2 extends Exception {  
}  
class MyException3 extends Exception {  
}  
class A {  
    public void proc() throws Exception{  
        try{  
            // 僅僅為瞭演示用  
            Random random = new Random();  
            int i = random.nextInt(3);  
            if (i == 0)  
                throw new MyException1();  
            else if (i == 1)  
                throw new MyException2();  
            else if (i == 2)  
                throw new MyException3();  
        }  
        catch(MyException1 e){  
            // 當拋出MyException1時會跳到這裡來。  
            e.printStackTrace();  
        }  
        catch(MyException2 e){  
            // 當

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *