《Java 核心技术卷1 第10版》学习笔记------异常
異常處理的任務就是將控制權從錯誤產生的地方轉移給能夠處理這種情況的錯誤處理器 。
7.1.1 異常分類
在 Java 程序設計語言中, 異常對象都是派生于 Throwable 類的一個實例 。 稍后還可以看到 , 如果 Java 中內置的異常類不能夠滿足需求 , 用戶可以創建自己的異常類 。
所有的異常都是由 Throwable 繼承而來, 但在下一層立即分解為兩個分支: Error 和 Exception。
Error 類層次結構描述了 Java 運行時系統的內部錯誤和資源耗盡錯誤 。 應用程序不應該拋出這種類型的對象 。 如果出現了這樣的內部錯誤, 除了通告給用戶, 并盡力使程序安全地終止之外 , 再也無能為力了 。 這種情況很少出現 。
在設計 Java 程序時 , 需要關注 Exception 層次結構 。 這個層次結構又分解為兩個分支 :一個分支派生于 RuntimeException ; 另一個分支包含其他異常。 劃分兩個分支的規則是 : 由程序錯誤導致的異常屬于 RuntimeException ; 而程序本身沒有問題 , 但由于像 I/O 錯誤這類問題導致的異常屬于其他異常。
派生于 RuntimeException 的異常包含下面幾種情況 :
? ?錯誤的類型轉換
? ?數組訪問越界
? ?訪問 null 指針
不是派生于 RuntimeException 的異常包括 :
? ?試圖在文件尾部后面讀取數據。
? ?試圖打開一個不存在的文件 。
? ?試圖根據給定的字符串查找 Class 對象, 而這個字符串表示的類并不存在 。
如果出現 RuntimeException 異常, 那么就一定是你的問題” 是一條相當有道理的規則 。
Java 語 言 規 范 將 派 生 于 Error 類 或 RuntimeException 類的所有異常稱為非受查( unchecked ) 異常 , 所有其他的異常稱為受查 ( checked ) 異常 。
編譯器將核查是否為所有的受査異常提供了異常處理器 。【即受查異常必須向上拋出或者捕獲處理】
7.1.2 聲明受查異常(keyword: throws)
注意:是受查異常,即 RuntimeException及其子類。
public Fi1elnputStream (String name) throws FileNotFoundException什么異常必須使用 throws 子句聲明 需要記住在遇到下面 4 種, 情況時應該拋出異常 :
? ??1 ) 調用一個拋出受査異常的方法, 例如 , FilelnputStream 構造器 。
? ??2 ) 程序運行過程中發現錯誤 并且利用 throw 語句拋出一個受查異常 (下一節將詳細地,介紹 throw 語句 ) 。
? ??3 ) 程序出現錯誤 , 例如, a [ - l ] =0 會拋出一個 ArraylndexOutOffloundsException 這樣的非受查異常 。
? ??4 ) Java 虛擬機和運行時庫出現的內部錯誤 。
? ??如果出現前兩種情況之一, 則必須告訴調用這個方法的程序員有可能拋出異常 。 為什么 ? 因為任何一個拋出異常的方法都有可能是一個死亡陷阱 。 如果沒有處理器捕獲這個異常, 當前執行的線程就會結束 。
? ? ?對于那些可能被他人使用的 Java 方法, 應該根據異常規范 ( exception specification ), 在方法的首部聲明這個方法可能拋出的異常 。
7.1. 3 如何拋出異常
String readData(Scanner in) throws EOFException{...while(...){if(!in.hasNext()) // EOF encountered{if(n < len)throw new EOFException(); // 拋出異常}...}return s; }7.1 .4 創建異常類
找到合適的異常父類,直接繼承即可。
java Jang.Throwabie 1.0 的幾個重要方法
? Throwable( )
? ?構造一個新的 Throwabie 對象, 這個對象沒有詳細的描述信息 。
? Throwable( String message )
? ?構造一個新的 throwabie 對象, 這個對象帶有特定的詳細描述信息 。 習慣上, 所有派生的異常類都支持一個默認的構造器和一個帶有詳細描述信息的構造器 。
?? String getMessage ( )
? ?獲得 Throwabie 對象的詳細描述信息 。
7.2 捕獲異常
?通常 , 應該捕獲那些知道如何處理的異常, 而將那些不知道怎樣處理的異常繼續進行傳遞 。
再次拋出異常與異常鏈;
try {access the database; } catch ( SQLException e) {// 這里, ServleException 用帶有異常信息文本的構造器來構造 。throw new ServletException ("database error: " + e . getMessageO ) ; }// 不過, 可以有一種更好的處理方法, 并且將原始異常設置為新異常的“原因”: try{access the database; }catch(SQLException e){Throwable se = new ServletException("database error");se.initCause(e); // 使用原始異常的信息初始化新異常【保留了原始異常信息】throw se; }/* 當捕獲到異常時, 就可以使用下面這條語句重新得到原始異常 : Throwable e = se.getCause(); 強烈建議使用這種包裝技術 。這樣可以讓用戶拋出子系統中的高級異常,而不會丟失原始異 常的細節 。 */finally 子句:
無論代碼是否有異常產生,最終都會去執行 finally 字句。
分析堆棧軌跡元素:
暫略
7.3 使用異常機制的技巧
下面給出使用異常機制的幾個技巧:
? ? 1.?異常處理不能代替簡單的測試
? ? ? ? 與執行簡單的測試相比, 捕獲異常所花費的時間大大超過了前者 , 因此使用異常的基本規則是 : 只在異常情況下使用異常機制 。[詳情參考《Java核心技術卷第十版》P:283]
? ? 2 . 不要過分地細化異常
? ? 3.?利用異常層次結構
? ? ? ?不要只拋出 RuntimeException 異常 。 應該尋找更加適當的子類或創建自己的異常類 。
? ? ? ?不要只捕獲 Thowable 異常 , 否則, 會使程序代碼更難讀 、 更難維護 。
? ? 4.?不要壓制異常
? ? 5.?在檢測錯誤時, “ 苛刻 ” 要比放任更好
? ? 6.?不要羞于傳遞異常
總結
以上是生活随笔為你收集整理的《Java 核心技术卷1 第10版》学习笔记------异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Java 核心技术卷1 第10版》学习
- 下一篇: 《Java 核心技术卷1 第10版》学习