1. 程式人生 > >JAVA-Exception&Error

JAVA-Exception&Error

運行時異常 出現異常 ocl fio tao rtp rtl dnw rtg

JAVA——Exception&Error

在萬物皆對象的JAVA中,先讓我們看看Exception和Error的地位吧:

技術分享圖片

可見Exception和Error都繼承自Throwable類,所以二者既有相同也有不同之處。相同之處就是他們都是程序出錯導致的,或說程序不正常運行才會實例化的類,不同之處就在於產生他們的的程序的出錯原因不同,下面就來詳細比較一下。

一,Exception&Error

從命名來看Error貌似比Exception要嚴重一點,事實確實如此。Error產生的情況一般是指不大可能出現且不可預料的情況,如JVM本身不正常,內存溢出,棧溢出等一些比較嚴重,會使程序終止的情況。而Exception通常是一些可以預料

的不好的情況,如類型轉換失敗,多線程數據插入失敗等,雖然程序出錯,但可預料,一般也不會使程序終止。

二,未受檢查異常和受檢查異常

1,Error和Exception的子類RuntimeException都是未受檢查的異常,也可以叫運行時異常,因為它們都是不可預料的,在程序運行時才會出現的異常。

2,Exception的其他子類是受檢查的異常,是指程序員可以在代碼中預料和捕捉到的程序異常,這也是程序員重點關註的地方。

三,異常處理

要搞清楚異常處理就得先知道try-catch-finally-return這幾個關鍵字的語法和使用,它們在程序中的語法位置如下:

try{
    //可能會產生異常的語句
}catch(Exception e){
    //產生異常後才會執行的代碼
}finally{
    //不管有沒有產生異常,在執行完上面兩個代碼塊後,此處代碼都會執行
}

畫個流程圖更容易理解,如下:

技術分享圖片

註意:還有一個return的用法很多人會出錯,當try-catch-finally中出現return語句時,要註意代碼執行順序,在代碼中講解,如下:

public int f1() {
        int res=0;
        try {
            res=1;
        }catch(Exception e){    
        }finally {
            res=5;      
        }
        return res;
    }
/*上面這段代碼的執行結果按照前面的流程圖推一下很容易知道f1()方法的返回值是5
但如果是下面這種代碼形式呢
*/
public int f2() {
        int res=0;
        try {
            res=1;
            return res;
        }catch(Exception e){    
        }finally {
            res=5;      
        }
        return res;
    }
/*f2()的返回值應該是1,因為在try中執行到return語句時程序會先將要return的值入臨時棧,此時finally中執行的操作改變res的值,但卻不會影響到存在臨時棧中return的值。
再看下面這種情況
*/
public int f3() {
        int res=0;
        try {
            res=1;
            return res;
        }catch(Exception e){    
        }finally {
            res=5;
            return res;
        }
    }
/*此時f3()返回值應該是5,因為程序會把finally中的return值替換掉try中的return值
*/

四,throw & throws

throw : 將產生的異常拋出(強調的是動作),拋出的既可以是異常的引用,也可以是異常對象。(位置: 方法體內

throws : 如果一個方法可能會出現異常,但沒有能力處理這種異常,可以在方法聲明處用throws子句來聲明拋出異常。用它修飾的方法向調用者表明該方法可能會拋出異常(可以是一種類型,也可以是多種類型,用逗號隔開)(位置: 寫在方法名 或方法名列表之後 ,在方法體之前。)

五,自定義異常

可以繼承Exception或Throwable類來定義自己的異常類型

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

異常拋出方法和自帶異常一樣,如下

public int exceptionTest(int a) throws MyException {
        if(a<10) {
            System.out.println("程序正常");
            return a;
        }
        else {
            throw new MyException("程序異常");
        }
    }

以及捕獲異常如下

public static void main(String[] args) {    
        Main m=new Main();
        try {
            int res=m.exceptionTest(11);
        } catch (MyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

JAVA-Exception&Error