建議114:不要在構造函數(shù)中拋出異常
Java異常的機制有三種:
Error類及其子類表示的是錯誤,它是不需要程序員處理也不能處理的異常,比如VirtualMachineError虛擬機錯誤,ThreadDeath線程僵死等。
RunTimeException類及其子類表示的是非受檢異常,是系統(tǒng)可能會拋出的異常,程序員可以去處理,也可以不處理,最經(jīng)典的就是NullPointException空指針異常和IndexOutOfBoundsException越界異常。
Exception類及其子類(不包含非受檢異常),表示的是受檢異常,這是程序員必須處理的異常,不處理則程序不能通過編譯,比如IOException表示的是I/O異常,SQLException表示的數(shù)據(jù)庫訪問異常?! ?/p>
我們知道,一個對象的創(chuàng)建過程經(jīng)過內存分配,靜態(tài)代碼初始化、構造函數(shù)執(zhí)行等過程,對象生成的關鍵步驟是構造函數(shù),那是不是也允許在構造函數(shù)中拋出異常呢?從Java語法上來說,完全可以在構造函數(shù)中拋出異常,三類異常都可以,但是從系統(tǒng)設計和開發(fā)的角度來分析,則盡量不要在構造函數(shù)中拋出異常,我們以三種不同類型的異常來說明之。
(1)、構造函數(shù)中拋出錯誤是程序員無法處理的
在構造函數(shù)執(zhí)行時,若發(fā)生了VirtualMachineError虛擬機錯誤,那就沒招了,只能拋出,程序員不能預知此類錯誤的發(fā)生,也就不能捕捉處理。
(2)、構造函數(shù)不應該拋出非受檢異常<