Java異常的語法應該是很簡單的,一個try,catch,finally,一個throws,throw,兩分鐘就可學完了。我相信許多人和我一樣,對于異常是這樣處理的:
1.寫程序時就等編譯器檢查,一旦通不過就加try,catch;
2.自己拋異常常常忘了在方法聲明時加throws,而且又不明白為什么有的異常需要throws,而有的又不需要;
3.從來不寫自己的異常類;
4.catch到異常不知道怎么辦,通通加一行printStackTrace拉倒;
如果屬于以上這幾種情況的,我覺得有必要和我一起討論一下Java的異常使用方法。

    查閱資料可以得知,Java最主要的異常類包括4種:Throwable、Error、Exception和RuntimeException;其中Throwable是所有異常類的父類,它繼承Object類并實現Serializable接口;Error和Exception都是Throwable的子類;而RuntimeException是Exception的子類。Exception的子類非常多,但是RuntimeException是一個特殊的子類,需要單獨討論。
    一般當程序員在某個方法中拋出一個Exception異常(或者其子類)時,需在方法頭部聲明此方法拋出了一個異常,就是用throws關鍵字來聲明;但是如果在方法中拋出一個RuntimeException或者一個Error時,則不需要聲明此方法拋出了異常,這是為什么呢?
    語法上的約束必然有其背后的道理;如果不去弄明白這些道理而是一味的依賴編輯器來幫忙,則事倍功半。事實上,Java語言的這種語法含義是:Java編譯器要求Java程序必須捕獲或聲明所有非運行時的異常,也就是說,Exception異常是需查異常,必須由程序員對它嚴格的負責,如果在方法中拋出,必須聲明,如果拋出的異常沒有被catch,則會出現語法錯誤,編譯都不能通過。這是強制性的讓程序員遵守Java的異常規則。這樣規定的原因是當Exception異常出現時,運行的程序還有補救的余地,通過異常處理代碼,可以讓程序恢復運行,如果不捕捉這種異常,則白白浪費了補救程序的機會。而且,這種異常應讓程序員可見,所以必須在方法頭部聲明此方法拋出了某種Exception異常。
    那么,Error和RuntimeException都是不需查異常,在方法中拋出這兩種異常都不需要聲明,在程序中不catch它們也不會造成語法錯誤。我的理解是,當出現這樣的異常時,運行的程序已經沒有補救的余地了,于是直接拋出異常讓程序結束是比較合理的安排。如果在程序運行時出現了Error或者RuntimeException,那么程序員也無能為力,所以它們可以對程序員透明,也不需要特意聲明讓程序員來處理它們。
    現在我們知道,try和catch一般對Exception及其子類使用,throws也是。而對于Error和RuntimeException則不需要throws,不過還是可以catch的,但是catch到它們一般也就是釋放資源,退出程序而已。
    對于catch到的異常的處理,最經常犯的錯誤就是丟失異常,catch到舊的異常拋出新的異常,等到程序出錯時就找不到舊異常的信息了。其實JDK1.4已經提供了這個問題的解決方案,就是用Exception的構造函數形成異常鏈,用舊異常作為參數構造新異常,這樣就可以在出錯時一步步跟蹤到所有出現過的異常了,這兩個構造函數就是:
    public Exception(String message, Throwable cause) {
    super(message, cause);
    }
    public Exception(Throwable cause) {
        super(cause);
    }
    就想到這么多,以后有了新體會再續。

                                                                           2005-03-02 15:40 作者: wxb_nudt