2009-07-01 17 views
46

事前に作成されたタイプとは別の新しいExceptionを作成するにはどうすればよいですか?カスタム例外を記述するにはどうしたらいいですか?

public class InvalidBankFeeAmountException extends Exception{ 
    public InvalidBankFeeAmountException(String message){ 
     super(message); 
    } 
} 

これは、最初の行に書かれているInvalidBankFeeAmountExceptionの警告が表示されます。

+0

私は自分自身で上記の1つの例外を作成しました。これは特別な例外の名前を持つクラスを作成し、Exceptionを拡張します。 BUT 警告は次のとおりです。シリアライズ可能クラス<その例外の名前>例外は、longのstatic final serialVersionUIDフィールドを宣言しません。 どうすれば解決できますか? – Johanna

+1

したくない場合は、その警告について心配する必要はありません。 Exceptionクラスはシリアライズ可能なので、クラスのシリアルIDを設定する必要があります。しかし、それは単なる警告なので、私は通常それを無視します。 – jjnguy

+0

しかし、このクラスをmain()メソッドの型として使用すると、次のような警告が表示されます。InvalidBankFeeAmountException型をスローすることはできません。 – Johanna

答えて

103

あなたがする必要があるのは、新しいclassを作成し、extend Exceptionにすることだけです。

Exceptionがチェックされていない場合は、extend RuntimeExceptionが必要です。

:確認Exceptiontry/catchブロックでExceptionを囲むか、メソッド宣言で「throws」節を持っているどちらかを必要とするものです。 (IOExceptionのように)チェックされていないExceptionsのチェックを外してExceptionsのようにスローすることができますが、明示的に扱う必要はありません(IndexOutOfBoundsException)。例えば

:あなたがしたい場合は、

  • RuntimeExceptionを:あなたの例外をチェックしたい場合は

    public class MyNewException extends RuntimeException { 
    
        public MyNewException(){ 
         super(); 
        } 
    
        public MyNewException(String message){ 
         super(message); 
        } 
    } 
    
  • +37

    注:Eclipseを使用している場合は、「新しい例外をスローする」と書いて、自動フィックス(Ctrl + 1)を使用します。これにより、Exceptionを拡張して定型コードを含む新しいクラスが作成されます。 –

    +4

    [RuntimeExceptions](http://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html)を拡張することは悪い習慣であると聞いています。*クライアントが合理的に復旧することが期待できる場合例外をチェック例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にしてください。* – Pureferret

    +0

    私は残りの答えを読んだだけで、それをカバーしています。 – Pureferret

    31

    はちょうど(throws節に必要なつまり)、

    • Exceptionのいずれかを拡張あなたの例外はチェックされません。
    3

    を見てみましょう:いつ、なぜあなたが作成したいのためのガイドラインのセットと一緒に

    public class DuplicateUsernameException 
        extends Exception { 
        public DuplicateUsernameException 
         (String username){....} 
        public String requestedUsername(){...} 
        public String[] availableNames(){...} 
    } 
    

    :例は2ページが与えられている

    http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=1

    をあなた自身の例外。

    3

    例外を除いて、特にチェック例外を除外しないように注意してください。 Joshua BlochのEffective Javaの第9章、特にItem 60(標準例外の使用を優先)を読むことをお勧めします。彼の推奨事項には、プログラムエラーのチェックされていない例外(RuntimeExceptions)を使用して復旧可能な例外に対するチェック例外の使用、およびチェック例外の不要な使用の回避が含まれます。

    プログラミングエラーが見つかるたびにInvalidBankAccount例外がスローされる場合は、代わりに標準のチェックされていないJava IllegalStateExceptionをスローしたいだけです。 (これは、serialVersionUIDを宣言する必要があるのをきちんと回避します。)

    関連する問題