Java簡明教程 11.異常

異常的感性認識html

沒有異常機制的語言中,常常經過返回值來表示調用該函數產生的各類問題(異常),好比c語言.java

divide.c程序員

#include <stdio.h>

int main() {
    if (-1 == divide(1, 1)) {
        printf("除數不能爲0.\n");
    }   
}


int divide(int divident, int divisor) {
    //若是除數爲0,則返回-1
    if (0 == divisor) {
        return -1; 
    }   


    //若是除法不爲0,則返回0
    printf("%d\n", divident/divisor);
    return 0;
}

 

在java中,經過它的異常處理機制,能夠對異常進行處理.ide

Divide.java函數

public class Divide {
    public static void main(String[] args) {
        //把有可能產生異常的句子放在try{}語句中
        try {
            divide(1, 0); 
        }
        //經過catch(){}語句對異常進行處理. 注意:能夠有多個catch(){}語句,由於有多個異常嘛
        catch(Exception e) {
            e.printStackTrace();
        }
        //finally{}裏面的程序塊,不管有沒有異常,都會執行,多用於關閉資源.(..粗俗的說,也能夠說是插屁股的")
        //注: finally{}能夠省略,但try{} catch(){}不行!
        finally {
            System.out.println("白白");
        }

        System.out.println("注意:對異常處理以後,後面的句子仍舊執行.");
    }


    public static int divide(int i, int j) {
        int result = i / j;
        return result;
    }   
}

 

異常的類型this

如上圖:(來源http://www.cnblogs.com/vamei/archive/2013/04/09/3000894.html)spa

橙色的表示不能夠處理的異常, 藍色的表示能夠處理的異常.code

其中,htm

Error(以及其衍生類)是系統錯誤(好比 內存不足, java內部錯誤等等), 這個咱們程序員是沒法處理的.對象

Exception下的衍生類 "RuntimeException", 這個是java程序自己有問題,也就是"bug"形成的. 好比"NullPointerException", "IndexOutOfBoundsException",  "ClassCastException"等等. 若是出現這些異常, 首先不是"try   catch", 而是檢查本身代碼是否出問題了

繼承了Exception又不是RuntimeException的子類,也就是上圖藍色部門的異常,咱們就須要處理了.這些異常每每是在與用戶交互的時候產生的,好比用戶想要讀取一個不存在的文件, 這個時候,就會出現"FileNotFoundException"異常. 這個咱們就必須處理了

 

 

總結:拋出異常對象(throw), 不對異常進行處理,將異常交給上層處理(throws),本身處理異常(try catch)

Demo.java

/* Exception in thread "main" java.lang.Exception: w的值不能爲負數!
 *  at Cup.test(Demo.java:32)
 *      at Cup.addWater(Demo.java:16)
 *          at Demo.main(Demo.java:4)
 */
public class Demo {
    public static void main(String[] args) throws Exception {
        Cup cup = new Cup();
        cup.addWater(-1.0);
    }   
}

class Cup {
    private double water = 0.0;
    private double maxWater = 100.0;        //杯子的最大容量爲100.0ml

    public void addWater(double w) throws Exception {
        test(w);
        //若是要加的水+原本擁有的水的體積小雨水杯的最大容量,那麼就 "this.water = w + this.water"
        //不然,水溢出,直接設置 water = 最大容量 100ml便可
        if (w + this.water < maxWater) {
            this.water = w + this.water;
        } else {
            this.water = 100.0;
        }   
    }   
        
    //檢查w的值是否正確,也就是檢查w是否是整數
    public void test(double w) throws Exception {
        if (w < 0) {
            Exception e = new Exception("w的值不能爲負數!");
            throw e;
        }   總結:拋出異常對象(throw), 不對異常進行處理,將異常交給上層處理(throws),本身處理異常(try catch)
    }   
}

 

自定義異常

DIYException.java

public class DIYExcetpion extends Exception {
    public DIYException(){}

    //在自定義異常的時候,要選擇更具體的類,這樣會包含更多的異常信息
    public DIYException(String message) {
        super(message);
    }   
}
相關文章
相關標籤/搜索