69.例外は真の例外の場合のみ使用する


例外


完全エラー使用例外の例

try{
	int i = 0;
    while(true)
    	range[i++].climb();
}catch (ArrayIndexOfBoundsException e){
}
上のコードは誤った推論に基づいて性能を向上させようとしている.JVMは、アレイ内の要素にアクセスするたびに、境界を超えているかどうかを確認します.したがって、このチェックを繰り返し文に適用すると、同じことが繰り返されるので、1つは省略します.しかし、この推論は3つの根拠で間違っている.
  • 例外は例外のために設計されているので、JVMの実施者にとって、明確なチェックのように迅速に作成する必要がある動機は弱い.
  • コードをtry-catchブロックに入れると、JVMが適用できる最適化が制限されます.
  • アレイを巡回する標準チューブは、以前に懸念されていた重複検査を実行しない.JVMは独自に最適化され、排除されます.
  • 例外は例外の場合にのみ使用できます.日常的な制御フローには絶対に使用できません.この原則はAPI設計にも同様に適用される.設計されたAPIの場合は、通常の制御フローでクライアントに異常が発生しないことを確認します.特定のステータスでのみ呼び出されるステータス関連メソッドを提供するクラスは、ステータスチェックメソッドを同時に提供する必要があります.たとえば、iteratorのnextとhasNextです.
    ステータスチェック方法の代わりにいくつかの方法があります.たとえば、ステータスが正しくない場合、空のオプションメソッドまたはreturn nullです.このオプションを選択する手順は、次のとおりです.
    外部同期を行わない場合、複数のスレッドが同時にアクセスできるか、外部要因によってステータスが変更される可能性がある場合は、オプションまたは特定の値を使用します.これは、ステータスチェックメソッドとステータス関連メソッド呼び出しの間で、オブジェクトのステータスが変化する可能性があるためです.
  • の性能が非常に重要な場合、ステータスチェック方法がステータスに依存するいくつかの方法の操作を繰り返し実行する場合、傍観者または特定の値が選択される.
  • 他のすべての場合、ステータスチェック方法はより良いかもしれません.可読性はやや良く、使用時に発見しにくい.ステータスチェックメソッドを呼び出すのを忘れた場合、ステータス依存メソッドは例外を投げ出し、エラーを明確に指摘します.