《Android應用開發攻略》——2.2 異常處理

2.2 異常處理

Ian Darwin
2.2.1 問題
Java有一個精心定義的異常處理機制,但是需要花費一定的時間學習,才能高效地使用而不至于使用戶或者技術支持人員感到沮喪。
2.2.2 解決方案
Java提供了一個Exception層次結構,正確地使用它能夠帶來相當大的靈活性。Android提供了包括對話框和Toast的多種機制,用于通知用戶錯誤的情況。Android開發者應該熟悉這些機制,并學習高效使用它們的方法。
2.2.3 討論
Java從推出時就有兩類異常(實際上是Exception類的父類Throwable):檢測型(checked)異常和非檢測型(unchecked)異常。在Java標準版中,編程人員明顯要面對這樣一個事實:在編譯的時候可以檢測到某些情況,但其他的情況則無法檢測。例如,如果許多PC上安裝一個桌面應用程序,可能有些PC上的磁盤空間已經很緊張,無法保存數據;與此同時,其他PC上應用程序依賴的一些文件可能由于用戶的錯誤(而非編程人員的錯誤)、偶發事件、老鼠咬斷電纜等情況而丟失。因此,IOException被當作“檢查型異常”,意味著編程人員必須檢查這類異常,檢查可以通過文件使用方法中的try-catch子句或者方法定義中的throws子句來完成。所有經過良好訓練的Java開發人員都知道如下的通用規則:
Throwble是可拋出異常層次結構的根。Exception及其子類(RuntimeException(及其子類)除外)都是檢測型異常。其他異常為非檢測型異常。
上述規則意味著,Error及其所有子類都是非檢測異常(見圖2-1)。例如,如果你收到一個VMError異常,說明出現了一個運行時bug,作為應用程序編程人員,對此你沒有什么可做的。RuntimeException子類包含了名稱超長的ArrayIndexOutOfBoundsException等異常,它和它的友元都是非檢測型異常,因為在開發時測試及捕捉這些異常是你的責任(參見第3章)。

image


捕捉異常的場所
早期對檢測型異常的(過度)使用導致許多早期Java開發人員編寫的代碼中到處都是try/catch代碼塊,部分原因是:在早期的一些培訓項目和書籍中,對throws子句的使用沒有得到足夠的重視。隨著Java本身越來越多地轉向企業應用,較新的框架(如Hibernate和Spring)出現并強調非檢測型異常的使用,這類問題才得到改正。現在,盡可能捕捉靠近用戶的異常這一理念已經得到普遍的接受。準備(在程序庫或者多個應用程序中)重用的代碼不應該嘗試錯誤處理,它們所能做的是所謂“異常轉譯”(Exception Translation),也就是說,將與技術相關的(通常是檢查型)異常轉換為通用的非檢測型異常。例2-1展示了基本的模式。
例2-1:異常轉譯
public String readTheFile(String f) {BufferedReader is = null;try {is = new BufferedReader(new FileReader(f));String line = is.readLine();return line;} catch (FileNotFoundException fnf) {throw new RuntimeException("Could not open file " + f, fnf);} catch (IOException ex) {throw new RuntimeException("Could not read file " + f, ex);} finally {if (is != null) {try {is.close();} catch(IOException grr) {throw new RuntimeException("Error on close of " + f, grr);}}}
}

注意,即便在這個代碼中,檢測型異常的用法也很零亂:is.close()實際上不可能失敗,但是因為將它放在finally塊中(如果文件打開但是出現了某種錯誤,這樣可以確保文件關閉),就必須使用另一個try-catch結構。因此,檢測型異常(很可能)是不好的,在新的API中應該避免使用它,在必要時應該用非檢測型異常來掃清道路。
Oracle官方網站和其他人則支持相反的看法。在本書網站上的一條評論中,Al Sutton提出了如下看法:
檢測型異常迫使開發人員承認錯誤的情況可能發生,他們必須思考處理錯誤的方式。在許多情況下,除了日志和恢復可能沒有太多的事情可做,但是開發人員仍然考慮到此類錯誤發生的時候所應采取的措施。這個例子說明阻止方法調用者區分文件不存在(因而沒有必要重新讀取)和文件讀取問題(文件存在但是無法讀取)這兩種不同錯誤情況之間的區別。
Android忠于JavaAPI,有許多檢測型異常(包括例子中說明的那些),因此對這些異常應該以相同的方式處理。
對異常的處理
應用程序應該始終報告異常。當我看到捕捉的異常卻不采取任何措施的代碼時,我總會感到絕望。但是,異常只應該報告一次(不要既進行記錄,又轉譯/重新拋出異常)。普通異常的重點是表示異常情況(正如名稱所表示的那樣)。因為在Android設備上沒有系統管理員或者控制臺操作員,所以必須向用戶報告異常情況。
你應該考慮通過一個對話框或者Toast通知報告異常。移動設備上的異常處理與臺式機有所不同。用戶可能正在開車(或者操作其他機器),與人交談,因此你不應該猜測他們的注意力都在應用程序上。記住,Toast通知只在屏幕上出現幾秒鐘,你可能會錯過它。如果用戶必須采取行動更正錯誤,就應該使用對話框。我知道大部分的示例(甚至在本書中也是一樣)使用Toast,這是因為Toast通知需要的代碼比對話框少(相反,BlackBerry API簡化了對話框:Dialog.alert("mes sage"))。Toast簡單地彈出,然后消失。對話框則要求用戶確認異常情況,或者授權應用程序執行某些付費操作(例如,啟動互聯網訪問,以便運行需要下載地圖數據的應用程序)。
注意: 使用Toast來“彈出”不重要的信息,而使用對話框顯示重要的信息并得到確認。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540843.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 默認瀏覽器 視頻播放 二維碼,Android調用系統默認瀏覽器訪問的方法

一、啟動android默認瀏覽器這樣子,android就可以調用起手機默認的瀏覽器訪問。二、指定相應的瀏覽器訪問1、指定android自帶的瀏覽器訪問( “com.android.browser”:packagename ;“com.android.browser.BrowserActivity”:啟動主…

請寫出3個Android布局,一起擼一波干貨集中營練練手Android(三)布局+實現篇

MPGankIO 布局篇整個App到了這里就開始準備開始實現邏輯啦,有沒有點小期待后續如果有需要可以爬一波包包通緝令的數據O(∩_∩)O~~我們的布局采用5.0之后的新布局控件1.CardViewCardView特別的屬性如下:android:cardCornerRadius:在布局中設置…

小米凈水器壓力傳感器_凈水器中RO的完整形式是什么?

小米凈水器壓力傳感器RO:反滲透 (RO: Reverse Osmosis) RO is an abbreviation of Reverse Osmosis. It is a course of action that aids the RO water purifier to banish unfavorable ions, dissolved solids, and TDS from the water. Reverse osmosis is the c…

即時通訊應用戰爭開打,到底誰能最終定義我們的交流方式?

題圖:風靡亞洲的Line 北京時間4月4日消息,據科技網站TechRadar報道,對業界來說,即時通訊應用是一個巨大的市場,除了專門發力該領域的公司,專注搜索的谷歌和專注社交的Facebook最近幾年也都開始深耕此類應用…

離散點自動生成等高線_有限自動機| 離散數學

離散點自動生成等高線有限狀態機 (Finite state machine) A finite state machine (FSM) is similar to a finite state automation (FSA) except that the finite state machine "prints" an output using an output alphabet distinct from the input alphabet. Th…

android點擊加號,Android仿微信朋友圈點擊加號添加圖片功能

本文為大家分享了類似微信朋友圈,點擊號圖片,可以加圖片功能,供大家參考,具體內容如下xml:xmlns:app"http://schemas.android.com/apk/res-auto"android:layout_width"match_parent"android:layout_height&qu…

AI 創業公司 Kyndi 獲850萬美元融資,幫助公司預測未來

雷鋒網(公眾號:雷鋒網)8月10日消息,據外媒報道, Kyndi 是一家總部位于帕洛阿爾托的 AI 創業公司。該公司今天宣布,已經完成了850萬美元的 B 輪融資。 本輪融資的資金來源包括 PivotNorth Capital,Darling Ventures 和 …

css max-width_CSS中的max-width屬性

css max-widthCSS | 最大寬度屬性 (CSS | max-width property) The max-width property is used to help in setting the width of an element to the maximum. Although if the element or content is already larger than the maximum width then the height of that content…

20個編寫現代CSS代碼的建議

本文翻譯自Danny Markov 的20-Tips-For-Writing-Modern-CSS一文。 本文歸納于筆者的Web Frontend Introduction And Best Practices:前端入門與最佳實踐中CSS入門與最佳實踐系列,其他的關于CSS樣式指南的還有提升你的CSS姿勢、Facebook里是怎樣提升CSS代碼質量的。本…

android package.xml,Android自動化編譯設置AndroidManifest.xml中package值(包名)

手動修改Android的AndroidManifest.xml中package值(包名)很簡單,手動修改即可。但是項目中需要把Android的項目源代碼放到服務器端在客戶下載時候動態編譯生成,且生成的app簽名相同但包名不同(若此時包名相同就是相同的app),這種需求需要在服…

css 相同的css屬性_CSS中的order屬性

css 相同的css屬性CSS | 訂單屬性 (CSS | order Property) Introduction: 介紹: Web development is an ever-growing field that would never find its end, therefore it is equally necessary to learn new ways to deal with the elements of the web page or …

StoreServ的ASIC架構師必須面向未來做出決斷

StoreServ陣列采用特殊硬件,即一套ASIC來加速存儲陣列操作,而且其每代陣列都會在這方面進行重新設計。目前的設計為第五代。 作為惠普企業業務公司研究員兼StoreServ架構師,Siamak Nazari當下主要負責第六代ASIC的設計工作。 每代ASIC設計往往…

android網頁省略分頁器,Android輕量級網頁風格分頁器

博客同步自:個人博客主頁輕量級仿網頁風格分頁器,和RecycleView封裝一起配合使用,也可單獨使用,喜歡就star、fork下吧~謝謝目錄功能介紹效果圖如何引入簡單使用依賴github地址功能介紹支持延遲加載分頁支持單獨分頁器組件使用&…

scala重載無參構造方法_Scala中的無參數方法

scala重載無參構造方法Scala無參數方法 (Scala parameterless method) A method which accepts no parameters from the calling code. It also denotes that there will not be any empty parentheses. These are special types of methods in Scala that are initialized and…

傳統存儲做到極致也驚人!看宏杉科技發布的CloudSAN

傳統存儲陣列首先考慮的是高可靠、高性能。那么在成本上、擴展上、部署上就差。 互聯網企業帶來分布式存儲,擴展上、部署上是優勢了,但是單節點的可靠性差、數據一致性差、IO延遲大、空間浪費嚴重,能耗大。 這兩者的問題,我想很多…

android inflate,Android 關于inflate

通俗的說,inflate就相當于將一個xml中定義的布局找出來.因為在一個Activity里如果直接用findViewById()的話,對應的是setConentView()的那個layout里的組件.因此如果你的Activity里如果用到別的layout,比如對話框上的layout,你還要設置對話框上的layout里的組件(像圖片ImageVie…

keil lic_LIC的完整形式是什么?

keil licLIC:印度人壽保險公司 (LIC: Life Insurance Corporation of India) LIC is an abbreviation of the Life Insurance Corporation of India. It is a public segment insurance and investment group corporation in India that generally deals with life …

“云”上存儲初顯規模 如何架構是關鍵

在安防系統中,存儲設備只是給數據提供存儲空間,數據存儲的意義更多是為了給上層應用提供二次挖掘。目前的智能分析、大數據、圖幀等技術都是基于數據存儲做的數據挖掘。為了將二次挖掘應用的性能提升到最高,在優化分析算法的同時,…

在線圖片轉成html,在線將JPEG 轉換成HTML。 免費將.jpeg 轉換成.html。

描述|介紹JPEG – is a popular graphic format, which is characterized by a high degree of compression, which leads to a decrease in image quality. It uses the technology of encoding of smooth color renditions, providing the ability to reduce the amount of d…

密碼學常用的算法填充模式_密碼學的操作模式

密碼學常用的算法填充模式Modes of operation of a block cipher are procedural rules for a generic block cipher. The different modes of operation result in different properties being achieved which add to the security of the underlying block cipher in the cry…