3

重複の可能性:
チェックされた例外とチェックされていない例外をいつ選択するか

こんにちは!

そのため、チェック済みまたはチェックなしの例外をいつスローするかについては、まだ慣れています。この場合、他の人が最も適切だと思うものを知りたいです。

class Correlation<T>
{
    private final T object1, object2;
    private final double correlationCoefficient;

    public Correlation(T object1, T object2, double correlationCoefficient)
    {
        if(Math.abs(correlationCoefficient) > 1.0 || (object1.equals(object2) && correlationCoefficient != 1.0))
            throw new IllegalArgumentException();

        this.object1 = object1;
        this.object2 = object2;
        this.correlationCoefficient = correlationCoefficient;
    }
}

したがって、この場合、ユーザーが不正なデータを渡す状況から簡単に回復できないため、実行時例外をスローしたいと思います。渡されるデータを制御できないことを事前に指摘したいと思います。可能であれば、コンストラクターの条件が真であることを保証するインターフェイスを作成します。ただし、これは既に計算された相関のための便利なクラスであるため、ユーザーが正確な情報を提供していることを信頼する必要があります。

よし、みんなの感想聞かせて!

4

3 に答える 3

6

これが正しい対応だと思います。あなたは効果的にバリアアサート、つまりバリアチェックを行っており、それらが間違っている場合はエンティティの作成を拒否しています。IllegalArgumentExceptionをスローできることをJavaドキュメントで文書化しますが、それ以外では正しいように見えます。

Joshua Block は、チェックされた例外とチェックされていない例外に関する優れた情報を提供しています。基本的な前提は、誰かに例外をチェックしてもらいたい場合を除き、未チェックの例外をスローする必要があるということです。このように考えると、一部のコーディングと戻り値が複雑になる可能性がありますが、一般的には、よりクリーンで効率的なコードになります。例外的なケースには例外を使用すると、物事がうまく機能します。

ちょうど私の2セント。


編集

明確にするために、これはあなたが持つべきJavaドキュメントのようなものです:

/**
 * <Something describing constructor, and what it does, ending with a period.>
 *
 * @param parameter <Describe the parameter - do one for each parameter of the constructor,
 *     and note which values may be illegal for that particular parameter.>
 * @throws IllegalArgumentException <the case for the illegal argument exception.>
于 2009-08-03T20:42:15.673 に答える
4

私の意見では、答えは次の点にかかっています。

  • 発信者が正常に回復できることを期待していますか?
  • この API は公開または内部使用を目的としていますか?

チェック例外を使用してはいけないと誰かが言うでしょう。それは純粋に主観的なものです。

于 2009-08-03T20:39:51.980 に答える
2

例外には常に説明テキストを含める必要があります。この特定のケースでは、2 つのチェックがあると考えることもできます。

    if(Math.abs(correlationCoefficient) > 1.0)
            throw new IllegalArgumentException("abs(correlationCoefficient) > 1.0 - " + correlationCoefficient);
    if((object1.equals(object2) && correlationCoefficient != 1.0))
            throw new IllegalArgumentException("object1==object2, but correlationCoefficient != 1.0, " + correlationCoefficient);

これにより、実際にスタック トレースを確認した人は、コードを詳細に調べなくても正確な原因を特定できます。何が起こったかわからないため、特定の例外は、複数の条件ではなく、1 つの条件によってのみトリガーされる必要があります。また、テスト シナリオでエラー状況を再現できない場合に重要となる可能性があるため、必要な情報をすべて含めてください。

于 2009-08-03T21:11:14.880 に答える