ユーザーは、特定のセットからIDを選択するように求められます。そのIDがコレクションに存在するかどうかを確認します。存在しない場合は、IndexOutOfBoundsException
後でスローしてキャッチします。そのような目的で実際にその例外を使用できますか、それとも非常に悪い習慣ですか?
5 に答える
がパラメータID
としてメソッドに渡され、事前事後条件の一部としてそれをチェックしたい場合は、IllegalArgumentException
またはをスローできますRuntimeException
。
IndexOutOfBounds
ここでは混乱するため、意味がありません。範囲外のアクセスを行うと発生する例外です
個人的には、チェックされた例外をスローするので、呼び出し元のメソッドはそれをキャッチするように強制されます。あなたにできることは
initCause
例外について、これをIllegalArgumentExceptionとして設定します
例えば
public method(int i) throws MyException {
if (i < 0) {
MyException e = new MyException();
e.initCause(new IllegalArugmentException());
throw e;
}
}
私はおそらく、例外がスローされたときに何が起こったのかが明らかであるというメッセージを渡すために正しいcorectorsを呼び出すでしょう。
本当に例外的な状況に直面している場合、例外をスローすることは本当に意味があります
クラスのコントラクトが、ユーザーがコレクションにない値をクエリしないと想定している場合、例外は適切です。おそらくIllegalArgumentExceptionまたはこのようなものです。
そうしないと、ボイラープレートコードが発生し、スタックの巻き戻しや例外の伝播が原因でパフォーマンスが大幅に低下することがあります。
したがって、例外をスローするか、事前定義された値を返すかは、一種のトレードオフです。
あなたの場合は「null」を返すことをお勧めします。
コンテキストによって異なりますが、IMOは、位置参照に関連付けられていない概念であるIDを検索している場合、その特定の例外(おそらく、アプリ固有のItemNotFoundまたは同等のもの)の悪用になります。
APIに、有効なオブジェクトを返すか例外をスローすることを指定するコントラクトがある場合は、例外をスローします。意味がある場合は、代わりにNullObjectパターンも検討してください。
呼び出しが機能し23
、呼び出しが機能し47
、その間に何も変更されていない場合、それが機能しない理由は35
、インデックスが範囲外であったことではありません。