1. ホーム
  2. java

[解決済み] クライアントの観点からは有効な入力が無効な場合、どの例外を投げるべきか

2022-02-01 01:26:22

質問

2本の直線の交点を求めるコードを書いています。 2本の直線の傾きが等しい場合、交わることはありません。しかし、一方では、傾きが等しい入力は完全に有効です。

public static Point calculateIntersection(Line line1, Line line2) {

    if (line1 == null || line2 == null) {
        throw new NullPointerException(" some message ");
    }

    if (line1.getConstant() == line2.getConstant()) {
        return new Point(0, line1.getConstant());
    }

    if (line1.getSlope() == line2.getSlope()) {
        throw new IllegalArgumentException("slopes are same, the lines do not intersect.");
    }

    int x = (line2.getConstant() - line1.getConstant()) / (line1.getSlope() - line2.getSlope());
    int y = line1.getSlope() * x + line1.getConstant();

    return new Point(x, y);
}

問題は、不正な引数例外を投げることが正しいかどうか? 入力は有効なので、完全に納得できるわけではありません。

カスタム例外は正しいか? 良い選択のように聞こえますが、追加の意見があれば助かります。

ありがとうございます。

解決方法は?

<ブロッククオート

質問は は、不正な引数例外を投げることは正しいことなのでしょうか?

つまり、バグなのか、ユーザーの入力ミスなのか、それともプログラムが対処できるはずのものなのか?

  • 2本の線が交差しないケースが明確に"bug"である場合、次のようになります。 IllegalArgumentException は大丈夫です。 そのために作られたのがこの例外です。 (なお、この例外は チェックなし 例外のため、捕捉/回復されないことが予想されます)。

  • もし、プログラムが自分で回復できることを期待するケースであれば、カスタム例外を使うのが一番良いアイデアです。 そうすれば、ライブラリメソッドが(例えば)スローしてコードが混乱する可能性を減らすことができます。 IllegalArgumentException ...は "two lines intersected" 以外の意味を持ちます。

  • もしこのケースが入力検証の一部としてエンドユーザーに報告するようなものであれば、 特定のカスタム例外よりも一般的な "検証エラー" 例外がより適切かもしれません。 しかし、このメソッドはユーザー入力の検証のために(単独で)使用するように設計されているようには見えません。


文脈によっては、例外をまったく投げない方が良い場合もありますが、(IMO)これはそのような文脈の一つではありません。 代替案としては null を返すか Point という値 というのは 呼び出し側のコードには、そのようなポイントはありません"。 代替案の問題点は

  • を返した場合 null を処理する必要があります。 null の場合......NPEが発生します。
  • 自然な Point のインスタンスで、quot;not a point"を意味するために使用される可能性があります。

これは、これらの代替案をうまく作れないと言うことではありません。 ただ、この文脈では、次のようになります。 おそらく その分手間がかかるし おそらく 目に見える形で見返りがあるわけではありません。