java-異常詳解

(一)異常機制出現的原因

異常處理能提升程序的健壯性,C語言中是通過函數返回值來處理異常的,這種做法的弊端:

1.返回值與現有邏輯可能衝突。

2.代碼可讀性差。執行代碼和異常處理代碼混淆在一起。

3.需瞭解函數返回值詳細信息,以做處理。

/**
 * 異常處理demo
 * 
 * @author peter_wang
 * @create-time 2014-9-24 上午9:24:35
 */
public class ExceptionDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int num = operateNum(5);
        // 函數外部使用者需知道異常返回值
        // 函數計算結果剛好爲-1,本質上不屬於異常範圍
        // 異常處理加重程序耦合性,異常處理和正常處理混淆在一起
        if (num == -1) {
            System.out.println("傳入參數不正確");
        }
        else {
            System.out.println("計算結果:" + num);
        }
    }

    private static int operateNum(int num) {
        if (num == 0) {
            return -1;
        }

        num = 10 / num;
        num -= 3;
        return num;
    }
}


(二)異常分類


系統級錯誤(error):如內存消耗完,通常情況下不需要理會。

編譯時錯誤:這種異常必須在代碼裏被顯示的捕獲語句包住,否則編譯不過,如FileNotFoundException。

運行時錯誤:代碼不規範產生的錯誤,出現錯誤需要程序員更改bug,如空指針異常和數組下標越界。


(三)異常的使用

1.不要忽略異常

        try {
           ......
        }
        catch (Exception e) {
        }
不處理異常,違背了異常設計的初衷,程序出錯難以找到錯誤原因。

2.不要把邏輯性較強的代碼分離

FileInputStream is = null;
        try {
            is = new FileInputStream(new File(""));
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            is.read();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
異常捕捉分離了邏輯較強的代碼,可讀性變差。應採用如下代碼

FileInputStream is = null;
        try {
            is = new FileInputStream(new File(""));
            is.read();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
3.能處理的異常不向上傳遞

對異常的處理有兩種方式:自己處理catch和向上傳遞throw。

向上傳遞代表了太多未知,能處理的自己處理,除非事先知道該信息需要上層處理才傳遞。

4.IO異常處理

如果使用了一些資源例如數據庫連接或者網絡連接,記住在finally中做一些清理工作(如關閉數據庫連接或者網絡連接)。

5.不要全部用Exception來捕捉異常

細化異常類型,能有利於處理和錯誤信息捕捉。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章