java提高篇(十六)-----異常(一)


     Java的基本理念是“結構不佳的代碼不能運行”!!!!!

      大成若缺,其用不弊。

      大盈若沖,其用不窮。

      在這個世界不可能存在完美的東西,不管完美的思維有多么縝密,細心,我們都不可能考慮所有的因素,這就是所謂的智者千慮必有一失。同樣的道理,計算機的世界也是不完美的,異常情況隨時都會發生,我們所需要做的就是避免那些能夠避免的異常,處理那些不能避免的異常。這里我將記錄如何利用異常還程序一個“完美世界”。

一、為什么要使用異常

      首先我們可以明確一點就是異常的處理機制可以確保我們程序的健壯性,提高系統可用率。雖然我們不是特別喜歡看到它,但是我們不能不承認它的地位,作用。有異常就說明程序存在問題,有助於我們及時改正。在我們的程序設計當做,任何時候任何地方因為任何原因都有可能會出現異常,在沒有異常機制的時候我們是這樣處理的通過函數的返回值來判斷是否發生了異常(這個返回值通常是已經約定好了的),調用該函數的程序負責檢查並且分析返回值。雖然可以解決異常問題,但是這樣做存在幾個缺陷:

      1、 容易混淆。如果約定返回值為-11111時表示出現異常,那么當程序最后的計算結果真的為-1111呢?

      2、 代碼可讀性差。將異常處理代碼和程序代碼混淆在一起將會降低代碼的可讀性。

      3、 由調用函數來分析異常,這要求程序員對庫函數有很深的了解。

      在OO中提供的異常處理機制是提供代碼健壯的強有力的方式。使用異常機制它能夠降低錯誤處理代碼的復雜度,如果不使用異常,那么就必須檢查特定的錯誤,並在程序中的許多地方去處理它,而如果使用異常,那就不必在方法調用處進行檢查,因為異常機制將保證能夠捕獲這個錯誤,並且,只需在一個地方處理錯誤,即所謂的異常處理程序中。這種方式不僅節約代碼,而且把“概述在正常執行過程中做什么事”的代碼和“出了問題怎么辦”的代碼相分離。總之,與以前的錯誤處理方法相比,異常機制使代碼的閱讀、編寫和調試工作更加井井有條。(摘自《Think in java 》)。

      在初學時,總是聽老師說把有可能出錯的地方記得加異常處理,剛剛開始還不明白,有時候還覺得只是多此一舉,現在隨着自己的不斷深入,代碼編寫多了,漸漸明白了異常是非常重要的。

二、基本定義

      在《Think in java》中是這樣定義異常的:異常情形是指阻止當前方法或者作用域繼續執行的問題。在這里一定要明確一點:異常代碼某種程度的錯誤,盡管Java有異常處理機制,但是我們不能以“正常”的眼光來看待異常,異常處理機制的原因就是告訴你:這里可能會或者已經產生了錯誤,您的程序出現了不正常的情況,可能會導致程序失敗!

      那么什么時候才會出現異常呢?只有在你當前的環境下程序無法正常運行下去,也就是說程序已經無法來正確解決問題了,這時它所就會從當前環境中跳出,並拋出異常。拋出異常后,它首先會做幾件事。首先,它會使用new創建一個異常對象,然后在產生異常的位置終止程序,並且從當前環境中彈出對異常對象的引用,這時。異常處理機制就會接管程序,並開始尋找一個恰當的地方來繼續執行程序,這個恰當的地方就是異常處理程序,它的任務就是將程序從錯誤狀態恢復,以使程序要么換一種方法執行,要么繼續執行下去。

     總的來說異常處理機制就是當程序發生異常時,它強制終止程序運行,記錄異常信息並將這些信息反饋給我們,由我們來確定是否處理異常。

三、異常體系

      java為我們提供了非常完美的異常處理機制,使得我們可以更加專心於我們的程序,在使用異常之前我們需要了解它的體系結構:如下(該圖摘自:http://blog.csdn.net/zhangerqing/article/details/8248186)。

1354439580_6933

      從上面這幅圖可以看出,Throwable是java語言中所有錯誤和異常的超類(萬物即可拋)。它有兩個子類:Error、Exception。

      其中Error為錯誤,是程序無法處理的,如OutOfMemoryError、ThreadDeath等,出現這種情況你唯一能做的就是聽之任之,交由JVM來處理,不過JVM在大多數情況下會選擇終止線程。

      而Exception是程序可以處理的異常。它又分為兩種CheckedException(受撿異常),一種是UncheckedException(不受檢異常)。其中CheckException發生在編譯階段,必須要使用try…catch(或者throws)否則編譯不通過。而UncheckedException發生在運行期,具有不確定性,主要是由於程序的邏輯問題所引起的,難以排查,我們一般都需要縱觀全局才能夠發現這類的異常錯誤,所以在程序設計中我們需要認真考慮,好好寫代碼,盡量處理異常,即使產生了異常,也能盡量保證程序朝着有利方向發展。

      所以:對於可恢復的條件使用被檢查的異常(CheckedException),對於程序錯誤(言外之意不可恢復,大錯已經釀成)使用運行時異常(RuntimeException)。

      java的異常類實在是太多了,產生的原因也千變萬化,所以下篇博文我將會整理,統計java中經常出現的異常,望各位關注!!

四、異常使用

      在網上看了這樣一個搞笑的話:世界上最真情的相依,是你在try我在catch。無論你發神馬脾氣,我都默默承受,靜靜處理。對於初學者來說異常就是try…catch,(鄙人剛剛接觸時也是這么認為的,碰到異常就是try…catch)。個人感覺try…catch確實是用的最多也是最實用的。

      在異常中try快包含着可能出現異常的代碼塊,catch塊捕獲異常后對異常進行處理。先看如下實例:

public class ExceptionTest {
    public static void main(String[] args) {
        String file = "D:\\exceptionTest.txt";
        FileReader reader;
        try {
            reader = new FileReader(file);
            Scanner in = new Scanner(reader);  
            String string = in.next();  
            System.out.println(string + "不知道我有幸能夠執行到不.....");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("對不起,你執行不到...");
        }  
        finally{
            System.out.println("finally 在執行...");
        }
    }
}

      這是段非常簡單的程序,用於讀取D盤目錄下的exceptionText.txt文件,同時讀取其中的內容、輸出。首先D盤沒有該文件,運行程序結果如下:

java.io.FileNotFoundException: D:\exceptionTest.txt (系統找不到指定的文件。)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at java.io.FileReader.<init>(FileReader.java:41)
    at com.test9.ExceptionTest.main(ExceptionTest.java:19)
對不起,你執行不到...
finally 在執行...

      從這個結果我們可以看出這些:

      1、當程序遇到異常時會終止程序的運行(即后面的代碼不在執行),控制權交由異常處理機制處理。

      2、catch捕捉異常后,執行里面的函數。

      當我們在D盤目錄下新建一個exceptionTest.txt文件后,運行程序結果如下:

1111不知道我有幸能夠執行到不.....
finally 在執行...

      11111是該文件中的內容。從這個運行結果可以得出這個結果:不論程序是否發生異常,finally代碼塊總是會執行。所以finally一般用來關閉資源。

      在這里我們在看如下程序:

public class ExceptionTest {
    public static void main(String[] args) {
        int[] a = {1,2,3,4};
        System.out.println(a[4]);
        System.out.println("我執行了嗎???");
    }
}

      程序運行結果:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
    at com.test9.ExceptionTest.main(ExceptionTest.java:14)

       各位請注意這個異常信息和上面的異常信息錯誤,為了看得更加清楚,我將他們列在一起:

java.io.FileNotFoundException: D:\exceptionTest.txt (系統找不到指定的文件。)
        Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4

      在這里我們發現兩個異常之間存在如下區別:第二個異常信息多了Exception in thread "main",這顯示了出現異常信息的位置。在這里可以得到如下結論:若程序中顯示的聲明了某個異常,則拋出異常時不會顯示出處,若程序中沒有顯示的聲明某個異常,當拋出異常時,系統會顯示異常的出處。

       

      由於這篇博文會比較長,所以分兩篇來介紹。下篇博文主要介紹Java異常的自定義異常異常鏈異常的使用誤區使用異常注意地方以及try…catch、throw、throws。望各位看客關注!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM