MDA之路

          MDA,UML,XML,Eclipse及Java相關的Blog
          posts - 53, comments - 494, trackbacks - 0, articles - 2
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Java語言的異常類使用討論

          Posted on 2005-03-02 15:40 wxb_nudt 閱讀(1323) 評論(1)  編輯  收藏 所屬分類: 技術雜談

              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);
              }
              就想到這么多,以后有了新體會再續。


          評論

          # re: Java語言的異常類使用討論  回復  更多評論   

          2006-10-18 09:25 by jj
          請問:
          如何設計一個復數類,并在其中的沒個成員方法中檢測可能出現的各種異常?
          謝謝解答!
          主站蜘蛛池模板: 库车县| 洛宁县| 瓮安县| 抚远县| 高碑店市| 平乡县| 中山市| 固安县| 张家界市| 台湾省| 霍林郭勒市| 安多县| 山东| 乐都县| 呼图壁县| 甘肃省| 双桥区| 鹤峰县| 盱眙县| 包头市| 贞丰县| 汉川市| 吉水县| 疏附县| 永善县| 乐清市| 剑河县| 建阳市| 台东县| 汶川县| 五大连池市| 镇沅| 剑河县| 山西省| 宁都县| 石首市| 岳池县| 田林县| 龙里县| 什邡市| 新田县|