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關鍵字即可,如下面一段程式碼所示:
1 2 3 4 5 6 7 |
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關鍵字。
下面看一個示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Main
{
public static void main(String[]
args) {
try {
createFile();
} catch (Exception
e) {
//
TODO: handle exception
}
}
public static void createFile() throws IOException{
File
file = new File( "d:/a.txt" );
if (!file.exists())
file.createNewFile();
}
|