官术网_书友最值得收藏!

5.5 異常處理

開發過程中,代碼的執行情況往往無法完全控制,例如,磁盤文件的讀寫權限、網絡的連接狀態、遠程資源的狀態(如遠程數據庫)等。如果不能有效處理代碼執行時的問題,程序就會崩潰,給用戶帶來非常不好的體驗。

作為開發人員,能夠處理程序運行中出現的問題是一項非常重要的工作。Java中也提供了這樣的機制。下面就討論異常處理的相關內容。

5.5.1 異常類

首先,在Java程序中出現異常時,相關信息會保存到Exception類或其子類的對象中,可以使用異常對象的成員來獲取異常信息,如:

□ getMessage()方法,返回異常的詳細信息。

□ getLocalizedMessage()方法,返回本地化的異常信息。

□ printStackTrace()方法,顯示調試信息。

下面的代碼會模擬除以零錯誤,并顯示捕獲的異常信息。

代碼執行結果如圖5-7所示。

圖5-7 除以零產生的異常

5.5.2 try-catch-finally語句

前面的示例中已經使用了try語句結構,其完整的應用格式如下。

    try{
        // 可能出現異常的代碼
    }catch(Exception ex){
        // 處理捕獲的異常
    }finally{
        // 最終處理工作
    }

這個語句結構的組成部分包括以下幾個。

□ try語句塊中包含應用的主要代碼,但這些代碼可能會出現異常。

□ catch語句塊可以有多個,每一個都可以處理具體的異常類。此外,一個catch語句塊也可以處理多個異常,此時可以使用|符號分隔圓括號中的異常對象。

□ finally語句塊為可選,如果使用finally語句塊,則無論try語句塊中的代碼是否出現異常,都會執行finally語句塊中的代碼,所以可以在這里做一些清理工作或者數據的最終處理。

下面的代碼同樣模擬一個除以零的異常,這一次添加了finally語句塊。

代碼執行結果如圖5-8所示。

圖5-8 使用try-catch-finally語句結構

5.5.3 throw語句

throw語句用于拋出異常,例如,當程序中繼續執行代碼的條件不滿足時,就可以拋出異常,并由catch語句塊捕獲。下面的代碼在try語句塊中使用throw語句拋出一個異常。

圖5-9 使用throw語句

代碼執行結果如圖5-9所示。

5.5.4 throws關鍵字

throws關鍵字一般用于方法的定義,說明方法可能會拋出的異常類型,調用方法時,應該針對相應的異常類型進行處理。下面的代碼演示了throws關鍵字的使用方法。

代碼很簡單,其中包括JavaDemo類(JavaDemo.java文件)中的三個靜態成員。

首先,定義一個靜態的嵌入類TestException,它繼承自Exception類,其中,重寫了getMessage()方法,用于返回異常的描述信息。

然后,定義一個靜態方法m1(),這里使用throws關鍵字說明m1()方法可能會產生TestException異常。m1()方法中,除了拋出TestException異常之外,其他什么操作也不會執行。然而,m1()方法的調用者未必知道方法實現的真相。

NetBeans開發環境中,在代碼中直接調用m1()方法時,會看到因為使用了throws關鍵字而給出的提示,如圖5-10所示。

圖5-10 未處理異常的提示

代碼中,調用使用了throws關鍵字的方法時,就應該使用try-catch語句結構來處理可能的異常,如下面的代碼所示。

圖5-11 異常測試

執行代碼,可以看到程序很“優雅”地捕獲了異常,如圖5-11所示。

5.5.5 try()語句結構

try()語句結構是Java 7中的新成員,它可以自動釋放對象。不過,對象的類型必須實現AutoCloseable接口。

下面的代碼(CAutoCloseable.java文件)創建一個用于實現AutoCloseable接口的CAutoCloseable類。

代碼中,AutoCloseable接口的實現非常簡單,只需要實現close()方法即可。接下來,使用try()語句結構來調用CAutoCloseable對象,如下面的代碼所示。

    public static void main(String[] args) {
        try(CAutoCloseable ac = new CAutoCloseable()) {
            System.out.println("使用對象");
        }
    }

示例中并沒有調用CAutoCloseable對象中的close()方法,但是try()結構會自動調用它,代碼執行結果如圖5-12所示。

如果對象的使用出現異常呢?調用evil()方法試驗一下,如下面的代碼所示。

    public static void main(String[] args) {
    try(CAutoCloseable ac = new CAutoCloseable()) {
    ac.evil();
        }
    }

執行代碼,可以看到,即使代碼出錯并且拋出異常,CAutoCloseable對象仍然能夠自動調用close()方法,如圖5-13所示。

圖5-12 使用try()語句結構之一

圖5-13 使用try()語句結構之二

主站蜘蛛池模板: 公安县| 峨眉山市| 策勒县| 英吉沙县| 逊克县| 措勤县| 衡水市| 鱼台县| 尼玛县| 区。| 巩留县| 东阳市| 宁国市| 卫辉市| 周口市| 安阳县| 秦皇岛市| 化隆| 布尔津县| 南江县| 鄂州市| 寻乌县| 泽州县| 玉田县| 贡觉县| 慈利县| 鹿邑县| 安新县| 松桃| 仪陇县| 绩溪县| 扬州市| 苏尼特左旗| 余姚市| 大荔县| 开平市| 高邮市| 衡阳市| 南宫市| 醴陵市| 陇南市|