Javaプログラミングスキルを完璧にしたいプログラマーとして、ランタイム例外を作成しなければならない状況に出くわすことがよくあります。
個人的には、NullPointerExceptionおよびIllegalStateExceptionは、私が作成したソフトウェアで最も一般的に使用されています。あなたはどう?
よく使用するランタイム例外は何ですか?どのような状況でそれらを使用しますか?
NullPointerExceptionをスローしません。私にとっては、何かがうまくいかないときにコードに自然に現れるものであり、開発者が何が起こるかを見る必要があります。その後、(s)彼は原因を修正し、それは二度と起こらない。
IllegalStateExceptionを使用して、オブジェクトが正しく構成されていないこと、または呼び出しの順序が正しくないことを通知します。ただし、理想的には、オブジェクトは悪い状態にならないようにし、間違った順序で呼び出すことはできないことを確認する必要があります(ビルダーと結果のオブジェクトを作成する...)。
メソッドがパラメーターが正しくないことを検出したときに、多くのIllegalArgumentExceptionを使用します。これは、処理を停止するパブリックメソッドの責任です(理解しにくい間接的なエラーを回避するため)。また、メソッドの先頭にあるいくつかのif
sは、ドキュメント化の目的(コードであるためコードから逸脱しないドキュメント:-)を提供します。
public void myMethod(String message, Long id) {
if (message == null) {
throw new IllegalArgumentException("myMethod's message can't be null");
// The message doesn't log the argument because we know its value, it is null.
}
if (id == null) {
throw new IllegalArgumentException("myMethod's id can't be null");
// This case is separated from the previous one for two reasons :
// 1. to output a precise message
// 2. to document clearly in the code the requirements
}
if (message.length()<12) {
throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'");
// here, we need to output the message itself,
// because it is a useful debug information.
}
}
特定のランタイム例外を使用して、より高いレベルの例外条件を通知します。
たとえば、アプリケーションのモジュールが起動できなかった場合、ModuleNotOperationalExceptionがスローされる可能性があります(インターセプターなどの汎用コード、または特定のコード)別のモジュールがそれを呼び出すとき。そのアーキテクチャ上の決定の後、各モジュールは他のモジュールを呼び出す操作でこの例外を処理する必要があります...
実行時例外は、プログラミングエラー(予期しないときに渡されるnull
参照、範囲外の配列インデックスなど)を表す必要があると常に考えてきましたが、チェック例外は、コード化された」(例:IOException
、SQLException
)。
これの1つの違反は、インターフェイスの定義を満たすために、RuntimeExceptionでチェック例外とすべきものをラップする必要がある場合があることです。簡単な例として、Java.util.List
複数のマシン間の分散リストを管理します。明らかに、これは独自に定義されている場合、チェック例外(おそらくIOException
のサブクラス)をスローしますが、このクラスにList
を実装させる利点は、クライアントが使用する場所ならどこでもほぼ透過的に使用できることです別のリスト。
これは、Joelが leaky abstraction と呼ぶ用語につながる可能性があります。そのため、スローできる例外とその意味をドキュメントに明記することが重要です。この場合、RuntimeException
のカスタムサブクラスは、根本的な原因を既存のランタイム例外クラスにシューホーンしようとするのではなく、一般に明確に伝えることがわかります。
Joshua Bloch inEffective Javaによると、
最も一般的に再利用される例外:
IllegalArgumentException
を比較的頻繁に使用します。ほとんどの場合、デフォルト値が論理値になるとすぐに返そうとしますが、そうでない場合もあるため、この値を使用します。
私が使用するもう1つはArrayIndexOutOfBoundsException
です。
UnknownException、非常に便利:P
org.Apache.commons.lang.NotImplementedExceptionも好きです
ほとんどの場合、ランタイム例外はスローしません。特定の条件をチェックした後ではなく、ユーザー定義の例外をスローします。しかし、私が使用したいくつかは-IllegalAccessException、ArithmeticException、NumberFormatExceptionおよびSecurityExceptionです。