Java 再學習 模糊的知識 (五)

(一)三種處理系統錯誤的機制:異常、斷言、日誌和調試

1. 派生於 RuntimeException 的異常(程序錯誤導致的異常)包含下面幾種情況:
  • 錯誤的類型轉換。
  • 數組訪問越界。
  • 訪問空指針。
2. 不是派生於 RuntimeException 的異常(程序本身沒有問題,其他錯誤導致的異常)包括:
  • 試圖在文件尾部後面讀取數據。
  • 試圖打開一個不存在的文件。
  • 試圖根據給定的字符串查找Class對象,而這個字符串表示的類並不存在。
3. “如果出現 RuntimeException 異常,那麼就一定是你的問題。”
4. Java語言規範將派生於 Error 類或 RuntimeException 類的所有異常稱爲未檢查異常,所有其他的異常稱爲已檢查異常。
5. 下列情況應該拋出或者捕獲異常:
  • 調用一個拋出已檢查異常的方法,例如,FileImputStream構造器。
  • 程序運行過程中發現錯誤,並且利用throw語句拋出一個已檢查異常。
  • 程序出現錯誤。
  • Java虛擬機和運行時庫出現的內部錯誤。
6. 一個方法必須聲明所有可能拋出的已檢查異常,而未檢查異常要麼不可控制(Error),要麼就應該避免發生(RuntimeException)。
7. 如何拋出異常類:

1)找到一個合適的異常類。(沒有就自定義一個派生於 Exception 或其子類的類習慣上,定義的類應該包含兩個構造器,一個是默認的構造器;另一個是帶有詳細描述信息的構造器(超類 Throwable 的 toString 方法將會打印出這些詳細信息))
2)創建這個類的一個對象。
3)將對象拋出。

8. 在 catch 子句中可以拋出一個異常,這樣做的目的是改變異常的類型。
9. 建議獨立使用 try/catch 和 try/finally 語句塊。這樣可以提高代碼的清晰度。
//內層的 try 語句塊只有一個職責,就是確保關閉輸入流。
//外層的 try 語句塊也只有一個職責,就是確保報告出現的錯誤。
//這種設計方式不僅清楚,而且還具有一個功能,就是將會報告 finally 子句中出現的錯誤。
InputStream in = ...;
try{
	try{
		//可能拋出異常的代碼
	}
	finally{
		in.close();
	}
}
catch(IOException e){
	//展示錯誤信息
}
10. 帶資源的 try 語句
//try 塊退出時會自動調用res.close();
//try 後面可以指定多個資源
try(Resource res1 = ...,Resource res2 = ...){
	//對資源進行操作
}
11. 使用異常機制的技巧:
  • 異常處理不能代替簡單的測試,使用異常的基本規則:只在異常情況下使用異常;
  • 不要過分地細化異常;
  • 利用異常層次結構;
  • 不要壓制異常;
  • 早拋出,晚捕獲。
12. 斷言 assert 關鍵字的兩種形式:

1)assert 條件;
2)assert 條件:表達式;
這兩種形式都會對條件進行檢測,如果結果爲 false,則拋出一個 AssertionError 異常。在第二種形式中,表達式將被傳入 AssertionError 的構造器,並轉換成一個消息字符串。

13. 什麼時候應該選擇使用斷言?請記住下面幾點:
  • 斷言失敗是致命的、不可恢復的錯誤。
  • 斷言檢查只用於開發和測階段。
    因此,不應該使用斷言向程序的其他部分通告發生了可恢復性的錯誤,或者,不應該作爲程序向用戶通告問題的手段。斷言只應該用於在測試階段確定程序內部的錯誤位置。

(二)有關集合的一些小知識

1. 需要一個循環數組隊列,可以使用 ArrayDeque 類。需要一個鏈表隊列,可以使用 LinkedList 類。
2. “for each”循環可以與任何實現了 Iterable 接口的對象一起工作。
3. 在傳統的集合類庫中,例如,C++ 的標準模版庫,迭代器是根據數組索引建模的。如果給定這樣一個迭代器,就可以查看指定位置上的元素,就像知道數組索引 i 就可以查看數組元素 a[i] 一樣。不需要查找元素,就可以將迭代器向前移動一個位置。這與不需要執行查找操作就可以通過 i++ 將數組索引向前移動一樣。但是,Java 迭代器並不是這樣操作的。查找操作與位置變更是緊密相連的。查找一個元素的唯一方法是調用 next ,而在執行查找操作的同時,迭代器的位置隨之向前移動。因此,應該將 Java 迭代器認爲是位於兩個元素之間。當調用 next 時,迭代器就越過下一個元素,並返回剛剛越過的那個元素的引用。
4. Iterator 接口的 remove 方法將會刪除上次調用 next 方法時返回的元素。
5. Java 庫中的一些具體集合:

Java Collection Class

6. 在 Java 程序設計語言中所有鏈表實際上都是雙向鏈接的。

學習整理自《Java 核心技術 卷一 基礎知識》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章