Java異常為我們提供了一致的識別和處理程序錯誤的機制,有效的異常處理能增強程序的健壯性和易于調試性。

首先還是重溫下java的異常體系結構,如圖所示,所有異常的根是Throwable,異常又分為checked exceptionunchecked exceptionRuntimeException就是屬于unchecked exceptionJVM 一旦捕捉到unchecked exception 就會終止當前運行的程序,并在console中打出錯誤信息。

 

Java exception hierarchyption 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);

    
//
}

從語法上講,IllegalArgumentExceptionunckecked exception 是不需要聲明的,但是為了從文檔的角度考慮,最好還是加上,這樣可以讓調用這個方法的程序員知道,這個方法會可能拋出該異常,需要加以捕捉和處理。

 

三、異常的處理

不管如何,最終程序肯定是要對異常進行處理的,否則會導致不確定情況的發生,但是選擇異常處理的位置卻是有技巧的,通常要么是程序在這些地方從異常中恢復、繼續執行且不會導致進一步異常的發生,要么是在這些地方能為用戶反饋特定的信息,比如,如何避免異常的發生或者如何從異常中恢復。因此,對于有用戶界面層的程序,將異常的捕捉和處理推遲到UI層是有好處的,在UI層可以使用對話框或者其他方式提示用戶出現異常。
 

參考文獻

Best Practices for Exception Handling by Gunjan Doshi

Three Rules for Effective Exception Handling by Jim Cushing