java異常處理設計和一些建議
程序設計在程序設計中,進行異常處理是非常關鍵和重要的一部分。一個程序的異常處理框架的好壞直接影響到整個項目的代碼質量以及后期維護成本和難度。試想一下,如果一個項目從頭到尾沒有考慮過異常處理,當程序出錯從哪里尋找出錯的根源?但是如果一個項目異常處理設計地過多,又會嚴重影響到代碼質量以及程序的性能。因此,如何高效簡潔地設計異常處理是一門藝術,本文下面先講述Java異常機制最基礎的知識,然后給出在進行Java異常處理設計時的幾個建議。
若有不正之處,請多多諒解和指正,不勝感激。
以下是本文的目錄大綱:
一。什么是異常
二.Java中如何處理異常
三。深刻理解try,catch,finally,throws,throw五個關鍵字
四。在類繼承的時候,方法覆蓋時如何進行異常拋出聲明
五。異常處理和設計的幾個建議
一。什么是異常
異常的英文單詞是exception,字面翻譯就是“意外、例外”的意思,也就是非正常情況。事實上,異常本質上是程序上的錯誤,包括程序邏輯錯誤和系統錯誤。比如使用空的引用、數組下標越界、內存溢出錯誤等,這些都是意外的情況,背離我們程序本身的意圖。錯誤在我們編寫程序的過程中會經常發生,包括編譯期間和運行期間的錯誤,在編譯期間出現的錯誤有編譯器幫助我們一起修正,然而運行期間的錯誤便不是編譯器力所能及了,并且運行期間的錯誤往往是難以預料的。假若程序在運行期間出現了錯誤,如果置之不理,程序便會終止或直接導致系統崩潰,顯然這不是我們希望看到的結果。因此,如何對運行期間出現的錯誤進行處理和補救呢?Java提供了異常機制來進行處理,通過異常機制來處理程序運行期間出現的錯誤。通過異常機制,我們可以更好地提升程序的健壯性。
在Java中異常被當做對象來處理,根類是java.lang.Throwable類,在Java中定義了很多異常類(如OutOfMemoryError、NullPointerException、IndexOutOfBoundsException等),這些異常類分為兩大類:Error和Exception。
Error是無法處理的異常,比如OutOfMemoryError,一般發生這種異常,JVM會選擇終止程序。因此我們編寫程序時不需要關心這類異常。
Exception,也就是我們經常見到的一些異常情況,比如NullPointerException、IndexOutOfBoundsException,這些異常是我們可以處理的異常。
Exception類的異常包括checked exception和unchecked exception(unchecked exception也稱運行時異常RuntimeException,當然這里的運行時異常并不是前面我所說的運行期間的異常,只是Java中用運行時異常這個術語來表示,Exception類的異常都是在運行期間發生的)。
unchecked exception(非檢查異常),也稱運行時異常(RuntimeException),比如常見的NullPointerException、IndexOutOfBoundsException。對于運行時異常,java編譯器不要求必須進行異常捕獲處理或者拋出聲明,由程序員自行決定。
checked exception(檢查異常),也稱非運行時異常(運行時異常以外的異常就是非運行時異常),java編譯器強制程序員必須進行捕獲處理,比如常見的IOExeption和SQLException。對于非運行時異常如果不進行捕獲或者拋出聲明處理,編譯都不會通過。
在Java中,異常類的結構層次圖如下圖所示:
在Java中,所有異常類的父類是Throwable類,Error類是error類型異常的父類,Exception類是exception類型異常的父類,RuntimeException類是所有運行時異常的父類,RuntimeException以外的并且繼承Exception的類是非運行時異常。
典型的RuntimeException包括NullPointerException、IndexOutOfBoundsException、IllegalArgumentException等。
典型的非RuntimeException包括IOException、SQLException等。
二.Java中如何處理異常 在Java中如果需要處理異常,必須先對異常進行捕獲,然后再對異常情況進行處理。如何對可能發生異常的代碼進行異常捕獲和處理呢?使用try和catch關鍵字即可,如下面一段代碼所示:
try { File file= new File( “d:/a.txt”); if(! file. exists()) file.createNewFile(); } catch(IOException e) { // TODO: handle exception}
被try塊包圍的代碼說明這段代碼可能會發生異常,一旦發生異常,異常便會被catch捕獲到,然后需要在catch塊中進行異常處理。
這是一種處理異常的方式。在Java中還提供了另一種異常處理方式即拋出異常,顧名思義,也就是說一旦發生異常,我把這個異常拋出去,讓調用者去進行處理,自己不進行具體的處理,此時需要用到throw和throws關鍵字。
下面看一個示例:
publicclassMain { publicstaticvoidmain(String[] args) { try{ createFile(); } catch(Exception e) { // TODO: handle exception} } publicstaticvoidcreateFile() throws IOException{ File file = newFile( “d:/a.txt”); if(!file.exists()) file.createNewFile(); } }
這段代碼和上面一段代碼的區別是,在實際的createFile方法中并沒有捕獲異常,而是用throws關鍵字聲明拋出異常,即告知這個方法的調用者此方法可能會拋出IOException。那么在main方法中調用createFile方法的時候,采用try…catch塊進行了異常捕獲處理。
當然還可以采用throw關鍵字手動來拋出異常對象。下面看一個例子:
publicclassMain { publicstaticvoidmain(String[] args) { try{ int[] data = newint[]{ 1, 2, 3}; System. out.println(getDataByIndex(- 1,data)); } catch(Exception e) { System.out.println(e.getMessage()); } } publicstaticintgetDataByIndex( intindex, int[] data) {if(index《 0||index》=data.length) thrownewArrayIndexOutOfBoundsException( “數組下標越界”); returndata[index]; } }
然后在catch塊中進行捕獲。
也就說在Java中進行異常處理的話,對于可能會發生異常的代碼,可以選擇三種方法來進行異常處理:
1)對代碼塊用try..catch進行異常捕獲處理;
2)在 該代碼的方法體外用throws進行拋出聲明,告知此方法的調用者這段代碼可能會出現這些異常,你需要謹慎處理。此時有兩種情況:
如果聲明拋出的異常是非運行時異常,此方法的調用者必須顯示地用try..catch塊進行捕獲或者繼續向上層拋出異常。
如果聲明拋出的異常是運行時異常,此方法的調用者可以選擇地進行異常捕獲處理。
3)在代碼塊用throw手動拋出一個異常對象,此時也有兩種情況,跟2)中的類似:
如果拋出的異常對象是非運行時異常,此方法的調用者必須顯示地用try..catch塊進行捕獲或者繼續向上層拋出異常。
如果拋出的異常對象是運行時異常,此方法的調用者可以選擇地進行異常捕獲處理。
(如果最終將異常拋給main方法,則相當于交給jvm自動處理,此時jvm會簡單地打印異常信息)
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%