Java異常為我們提供了一致的識別和處理程序錯誤的機制,有效的異常處理能增強程序的健壯性和易于調試性。
首先還是重溫下java的異常體系結構,如圖所示,所有異常的根是Throwable,異常又分為checked exception和unchecked exception,RuntimeException就是屬于unchecked exception,JVM 一旦捕捉到unchecked
exception 就會終止當前運行的程序,并在console中打出錯誤信息。
ption hierarchy
一、Unchecked
exceptions
VS Checked exceptions
下表列出使用兩種異常的場合:
Client's reaction when exception happens
|
Exception type
|
Client code cannot do anything
|
Make it an unchecked exception
|
Client code will take some useful
recovery action based on information in exception
|
Make it a checked exception
|
這個方面的例子hibernate就是一個,在hibernate2中,HibernateException還是checked exceptions,但是到了hibernate3中就成了unchecked exceptions,因為對于數據庫操作來說,一旦出現異常,就是比較嚴重的錯誤,而且在client端基本上是無能為力的,使用unchecked
exceptions更加合適。
另外,unchecked exceptions的優點在于不強迫客戶端代碼顯式地處理他們,異常可以一直往上傳遞(除非需要轉化異常,否則異常不需要在中間被捕捉,節省了很多的try{}catch(),代碼更加簡潔),直到你想捕捉處理他們,(有人會問,如何不強制客戶端處理他們,比如像checked exceptions這樣,不處理就是語法錯誤,如何保證異常能夠得到處理呢?在這點上,java提供的完善的文檔機制,通過API客戶端程序員可以很方便地知道他調用的方法可能會拋出什么異常,一個負責人的程序員就應該對其進行catch和處理),Java API提供了很多的unchecked exceptions,比如NullPointerException
, IllegalArgumentException
, and IllegalStateException
,使用java提供的標準的
unchecked exceptions是值得推薦的,這樣的好處在于使代碼更加簡潔并可以減少代碼對內存的占用。
二、Java異常的推遲處理
Java異常應該盡可能地推遲處理,除非要轉化異常,重新拋出,否則最好不要處理,而是留給最后能夠處理異常的地方。
通過為方法添加throws聲明,可以將處理異常的責任傳遞到更高的層次。在聲明哪些需要拋出的時候,應該盡可能地詳細。這樣做的目的是可以在API中詳細地表述出該方法可能會出現的異常,從而讓調用該方法的clinet程序員做好處理異常的準備,比如對于代碼通過throws語句詳細地聲明了可能會拋出的異常,這樣調用該方法的程序員就會知道將會有什么樣的異常會發生。
public void readPreferences(String filename)
throws IllegalArgumentException,
FileNotFoundException, IOException
{
if (filename == null)
{
throw new IllegalArgumentException
("filename is null");
} //if
//
InputStream in = new FileInputStream(filename);
//
}
從語法上講,IllegalArgumentException是unckecked exception 是不需要聲明的,但是為了從文檔的角度考慮,最好還是加上,這樣可以讓調用這個方法的程序員知道,這個方法會可能拋出該異常,需要加以捕捉和處理。
三、異常的處理
不管如何,最終程序肯定是要對異常進行處理的,否則會導致不確定情況的發生,但是選擇異常處理的位置卻是有技巧的,通常要么是程序在這些地方從異常中恢復、繼續執行且不會導致進一步異常的發生,要么是在這些地方能為用戶反饋特定的信息,比如,如何避免異常的發生或者如何從異常中恢復。因此,對于有用戶界面層的程序,將異常的捕捉和處理推遲到UI層是有好處的,在UI層可以使用對話框或者其他方式提示用戶出現異常。
參考文獻
Best
Practices for Exception Handling by Gunjan Doshi
Three
Rules for Effective Exception Handling by Jim
Cushing