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