- Java與Android移動應用開發:技術、方法與實踐
- 曹化宇
- 1363字
- 2019-12-06 15:39:17
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()語句結構之二
- PWA入門與實踐
- Oracle 11g從入門到精通(第2版) (軟件開發視頻大講堂)
- 微服務與事件驅動架構
- Rust實戰
- 信息可視化的藝術:信息可視化在英國
- Mastering Python Scripting for System Administrators
- UI智能化與前端智能化:工程技術、實現方法與編程思想
- 計算機應用基礎案例教程
- 一本書講透Java線程:原理與實踐
- Python機器學習算法與應用
- Kubernetes進階實戰
- 自學Python:編程基礎、科學計算及數據分析(第2版)
- Instant jQuery Boilerplate for Plugins
- Java Web開發實例大全(基礎卷) (軟件工程師開發大系)
- App Inventor 2 Essentials