2009-11-18 30 views

回答

253

要定義檢查例外您創建的java.lang.Exception一個子類(或子類的層次)。例如:

public class FooException extends Exception { 
    public FooException() { super(); } 
    public FooException(String message) { super(message); } 
    public FooException(String message, Throwable cause) { super(message, cause); } 
    public FooException(Throwable cause) { super(cause); } 
} 

中的方法有可能拋出或傳播此異常也必須進行申報:

public void calculate(int i) throws FooException, IOException; 

...和代碼調用此方法必須自行處理或傳播此異常(或兩者):

try { 
    int i = 5; 
    myObject.calculate(5); 
} catch(FooException ex) { 
    // Print error and terminate application. 
    ex.printStackTrace(); 
    System.exit(1); 
} catch(IOException ex) { 
    // Rethrow as FooException. 
    throw new FooException(ex); 
} 

你會在上面的例子IOException被捕獲並重新拋出的FooException通知。這是用於封裝異常(通常在實現API時)的常用技術。

有時會出現您不希望強制每種方法在其throws子句中聲明您的異常實現的情況。在這種情況下,您可以創建一個未檢查的異常。一個未經檢查的異常是延伸java.lang.RuntimeException(其本身是java.lang.Exception子類)的任何異常:

public class FooRuntimeException extends RuntimeException { 
    ... 
} 

方法可以拋出或傳播FooRuntimeException例外不宣它;例如

public void calculate(int i) { 
    if (i < 0) { 
    throw new FooRuntimeException("i < 0: " + i); 
    } 
} 

未檢查異常通常用於表示一個程序員錯誤,例如通過一個無效參數的方法或企圖觸犯數組索引邊界。

java.lang.Throwable類是可以在Java中引發的所有錯誤和異常的根。 java.lang.Exceptionjava.lang.Error都是Throwable的子類。任何小類Throwable可能會被拋出或被捕獲。但是,捕獲或拋出Error通常是不好的做法,因爲它用於表示JVM內部的錯誤,通常不會由程序員「處理」(例如OutOfMemoryError)。同樣,你應該避免捕獲Throwable,這可能導致你除了Exceptions之外還捕獲Errors。

6

對於檢查的異常:

public class MyCustomException extends Exception { } 

從技術上講,任何擴展Throwable可以是一個拋出,但讓他們基於所檢查異常(RuntimeException的除外或者類異常一般是Exception類的擴展它不會被檢查),而不是其他常見類型的可拋出的,它們通常不是被設計爲在JVM內部之外被優雅處理的東西。

您也可以使異常非公開,但您只能在定義它們的包中使用它們,而不是跨包。

至於投擲/捕獲自定義異常,它的工作原理就像內置的 - 通過

throw new MyCustomException() 

扔,並通過

catch (MyCustomException e) { } 
+3

RuntimeException擴展了異常,而不是檢查的異常。 – Adamski

+2

從技術上講,任何延伸'Throwable'的東西都可以*拋出*;異常擴展了'Exception'。 Throwable的自定義子類不會被try {...} catch(Exception e){...}塊攔截。 –

+0

爲什麼人們喜歡這個答案?它包含一些不準確的地方。 1)因爲它是一個接口,所以你不能* implmenet * throwable。 2)任何*擴展* Throwable是**不是**異常('錯誤'不是一個例外,這是一個錯誤)。 3)它意味着Exception的任何子類都被檢查,而RuntimeException不是。 Adamski給出的答案要準確得多! –

23
public class MyException extends Exception { 
     // special exception code goes here 
} 

把它捉住爲:

throw new MyException ("Something happened") 

Catch as:

catch (MyException e) 
{ 
    // something 
}