web-dev-qa-db-ja.com

RuntimeExceptionの適切な使用?

重複の可能性:
Javaでは、いつチェック例外を作成し、いつランタイム例外にする必要がありますか?

RuntimeExceptionではなくExceptionから例外を取得する必要があるのはいつですか?

RuntimeExceptionは、メソッドのthrows句で宣言する必要はありません。これは、good具体的にリストする必要がないため、またはbadメソッドの例外を明示的に宣言することをお勧めします。

考え?

18
Tony the Pony

From nchecked Exceptions-The Controversy

クライアントが例外からの回復を合理的に期待できる場合は、それをチェック済みの例外にします。クライアントが例外から回復するために何もできない場合は、チェックされていない例外にします。

チェックされていない例外は RuntimeException から派生したものであり、チェックされた例外は Exception から派生したものであることに注意してください。

クライアントが例外から回復するために何もできないのに、なぜRuntimeExceptionをスローするのですか?記事の説明:

ランタイム例外は、プログラミングの問題の結果である問題を表します。そのため、APIクライアントコードは、それらから回復したり、何らかの方法でそれらを処理したりすることを合理的に期待することはできません。このような問題には、ゼロ除算などの算術例外が含まれます。 null参照を介してオブジェクトにアクセスしようとするなどのポインタ例外。インデックスが大きすぎたり小さすぎたりすることで配列要素にアクセスしようとするなど、インデックスの例外。

54
Derek Mahar

エンタープライズアプリケーション開発には、Exceptionの代わりにRuntimeExceptionを使用するシナリオがたくさんあります。以下は、かなり一般的な2つのシナリオです。

  • アスペクトとして例外処理を実装する場合(関心の分離設計原則を分離する)、最近のほとんどのフレームワークでは、例外を宣言的に処理し、特定の例外処理ブロックをハードコーディングするのではなく関連付けます。この良い例の1つは、すべてのSQL例外をRuntimeExceptionに変換するSpringのJDBCテンプレートです。これにより、開発者はデータアクセスロジックの作成中にtrycatchブロックを記述しません。 devenvで異なる動作を提供できる例外ハンドラーを宣言的に定義できます。生産におけるさまざまな動作。同様の実装がStruts1.x Actionクラスにもあります。ここでは、executeメソッドがExceptionをスローするように宣言されており、特定の例外を処理するためにstruts-configにマップされた個別のExceptionHandlerがあります。これはRuntimeExceptionの例ではありませんが、通常の実行と例外処理の問題を分離するための設計原則は同じです。
  • RuntimeExceptionのもう1つの使用法は、トランザクションがコンテナーごとにコントローラーであるEJBおよびその他のトランザクションマネージャーです。慣例により、このようなコンテナでは、コード内からRuntimeExceptionをスローすると、トランザクションがロールバックします。例外をスローした場合も同じことは起こりません。

これらはすぐに頭に浮かぶ2つの重要なシナリオですが、もちろん他のシナリオもあります。

13