http://hi.baidu.com/geniusian/item/b06a1e51c6bc7c958c12edaa
異常
1,在java中,一個異常對象總是Throwable子類的執行個體。
2,Error類體系描述了Java運行系統中的內部錯誤以及資源耗盡的情況。
3,由編程導致的錯誤,會導致RuntimeException異常。而其他錯誤原因導致的異常----例如,因為I/O錯誤導致的曾經運行正確的程式出錯,都不會導致RuntimeException異常。
4,從RuntimeException衍生出來的異常包括下面的問題:1〉錯誤的類型轉換;2〉數組越界訪問;3〉試圖訪問一個null 指標。
5,不是從RuntimeException衍生出來的異常包括:1〉試圖從檔案尾後面讀取資料;2〉試圖開啟一個錯誤格式的URL;3〉試圖用一個字串來構造一個Class對象,而當該字串對應的類並不存在;
6,處理RuntimeException的原則是:如果出現RuntimeException,則一定是你的錯誤;
7,不同的瀏覽器可以處理不同類型的URL,所以,URL格式是否錯誤依賴於具體的環境,而不僅僅是程式碼;
8,Java語言規範中將任何Error的子類以及RuntimeException的子類都稱為未檢查異常,而其他的異常則稱為已檢查異常;
9,僅僅在以下4種情況下,才會拋出異常:1〉調用了一個會拋出"已檢查異常"的方法,例如BufferReader類的readLine方法;2〉程式運行過程中發生了錯誤,並且用throw語句拋出一個"已檢查異常";3〉程式錯誤,例如a[-1]=0會拋出一個"未檢查異常"如數組下標越界(ArrayIndex--OutOfBoundsException);4〉Java虛擬機器或者是執行階段程式庫出現了內部錯誤;
10,不需要聲明java的內部錯誤。一個方法必須聲明它可能拋出的全部"已檢查異常"。如果在自己的子類中覆蓋了一個來自父類的方法。特別需要注意的是,如果父類方法根本沒有拋出任何"已檢查異常",則子類也只能如此(PS:如果子類中覆蓋了父類的方法,則子類方法所能拋出的“已檢查異常”絕對不能超過其父類方法!子類必須捕捉所有“已檢查異常”自己處理!)
11,在Java中,沒有throws指示符的方法是不能拋出任何已檢查異常的,所以"actionPerformed方法不能拋出任何已檢查異常";
12,對於try/catch代碼塊,如果方法內的任何代碼拋出了一個異常,同時它的類型沒有在catch中指定,則方法會立即退出;
13,應捕捉並且處理那些已知如何處理的異常(用catch),而傳遞那些不知如何處理的異常(用throws);
14,對於try/catch/finally代碼塊,無論是否捕獲異常,都會執行finally從句中的代碼;
15,雖然Java程式員必須在finally從句中人工設定代碼來回收資源,但由於Java內建有"垃圾收集"機制,所以只有極少數的資源才要求人工進行回收;
16,actionPerformed方法不能拋出任何已檢查異常(沒有throws指示符);
17,使用異常機制的一些技巧:
1〉異常控制不能代替簡單的測試,和執行簡單的測試相比,捕捉異常所需的時間大大超過前者,所以,只有在異常情況下才使用異常;
2〉不要過分細化異常;
3〉不要壓制異常:可以使用如下格式: try { //代碼 } catch (Exception e) { //空 }
4〉不要羞於傳遞異常:對於某些異常(如調用FileInputStream構造器或者readLine方法產生的異常),傳遞它比捕捉它更好。讓高層的方法來通知使用者發生了錯誤或者放棄執行不成功的命令更合適;
18,異常鏈:代碼中捕獲原始異常A,現拋出一個與錯誤對應的自訂異常B,如需要原始資訊,只需調用B.getCause()即可。書中樣本如下:
public void actionPerformed(ActionEvent event){
out=new FileWriter(filename); //可能拋出IOException
}
因為actionPerformed方法不能拋出任何已檢查異常。如果你的程式不能處理這個異常,則需要捕獲該異常並且將它轉換為一個未檢查異常。(註:actionPerformed不能拋已檢查異常,故代碼內轉成未檢查異常可以拋出去,然後讓別人處理)。
try{ out=new FileWriter(filename);}
catch (IOException checked) { RuntimeException unchecked = new RuntimeException(checked); throw unchecked}
調用者得到的是轉換後的未檢查異常,若想得到它的起因“cause”即原已檢查異常,通過e.getCause()即可得到。
19,throw和throws的區別:
a)通常在一個方法(類)的聲明處通過throws聲明方法(類)可能拋出的異常資訊,而在方法(類)內部通過throw聲明一個具體的異常資訊;
b)throws通常不用顯示的捕獲異常,可由系統自動將所有捕獲的異常資訊拋給上級方法,throw則需要使用者自己捕獲相關的異常,而後在對其進行相關封裝,最後在將封裝後的異常資訊拋出;
c)對異常處理方式不同.throws對異常不處理,誰調用誰處理,throw 主動拋出自訂異常類對象
d)throws拋出的是類,throw拋出的是對象。
e)throws可以單獨使用,即方法內可以不用程式員自己捕獲,異常處理機制會自行捕獲throws內包含的異常;而throw不可單獨使用,如果你在方法中throw一個異常,卻沒有在方法聲明中聲明之,編譯器會報錯;
日誌
18,可以通過調用Logger.getLogger("global").info而不是System.out.println來輸出調試資訊(其中,info為日誌紀錄等級);
19,記錄名類似於包名,是具有階層的,記錄器和其子記錄器之間共用某些屬性;
20,系統為記錄器設定了七個層級的記錄等級:SERVER、WARNING、INFO、CONFIG、FINE、FINER、FINEST.預設的設定是僅僅記錄頭三個層級的紀錄(即INFO以上),可以通過Level.ALL來記錄全部記錄,或者使用Level.OFF來關閉全部記錄;
21,日誌管理是在虛擬機器的啟動過程中被初始化的,是先於main方法的執行的;
22,如同日誌管理器,Tlog器也有層級(預設INFO)。對於一個要被記錄的下來的紀錄,它的記錄等級必須要大於記錄器和處理器的層級才行;
23,記錄檔模式變數:%h 系統變數user.home變數
%t 系統臨時目錄
%u 用來解決名字衝突的保證唯一性的數字
%g 對迴繞的記錄檔產生的數字(當使用了迴繞功能,而模式沒有包含%g時,使用%g尾碼)
%% 表示%字元
24,要在日誌記錄期或處理器中安裝一個過濾器,只需要調用setFileter方法就可以了,但我們同時只能最多有一個過濾器;
25,調用setFormatter方法來將格式器安裝到處理器中;
斷言
26,預設情況下,斷言市關閉的。可通過-ea來開啟,用-da來關閉。選項-ea:...會開啟預設包中全部類的斷言功能,開啟或者關閉斷言是類裝載器的功能;
27,-da和-ea選項對那些沒有類載入器的"系統類別"是不起作用的。對於這些系統類別,要使用-enablesystemassertions/-esa選項來開啟斷言功能;
28,斷言提示:1>宣告失敗是致命的,不可恢複的錯誤;2>斷言檢查僅僅用在程式開發與測試階段;因此,不應該用斷言作為訊號來通知程式的另外部分發生了可恢複錯誤,或者將斷言作為通知程式使用者的方式。斷言僅僅應該在測試階段用來定位程式內部錯誤;
29,斷言是在測試和調試階段使用的工具,而日誌是在程式整個生命週期中都使用的策略性工具。