46

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);
}

問題は、不正な引数の例外をスローすることですか? 入力は有効なので、完全に納得するわけではありません。

カスタム例外は正しいことですか? 良い選択のように思えますが、追加の意見が役立ちます。

ありがとう

4

6 に答える 6

50

問題は、不正な引数の例外をスローするのは正しいことですか?

この状態をどのように「フレーム化」する必要があるかによって異なります。つまり、それはバグなのか、ユーザー入力エラーなのか、それともプログラムが対処できるはずのものなのか?

  • 交差しない 2 つの線のケースが明確に「バグ」である場合は、IllegalArgumentException問題ありません。これは、例外が設計されているものです。(これはチェックされていない例外であるため、キャッチ/回復されないことが予想されます。)

  • これが、プログラムが自動的に回復できると予想される場合は、カスタム例外が最適です。IllegalArgumentExceptionそうすれば、 「2 つの行が交差する」以外の何かを意味するよりも、(たとえば) ライブラリ メソッドがスローする (たとえば) ことによってコードが混乱する可能性を減らすことができます。

  • このケースが、入力検証の一部としてエンド ユーザーに報告されることが予想されるものである場合は、特定のカスタム例外よりも一般的な "検証エラー" 例外の方が適している可能性があります。ただし、このメソッドは、ユーザー入力の検証のみに使用するように設計されているようには見えません。


一部のコンテキストでは、例外をまったくスローしない方がよい場合がありますが、(IMO) これはそれらのコンテキストの 1 つではありません。代替手段は、呼び出し元のコードに「そのようなポイントがない」ことを意味する値を返すnullか返すことです。代替案の問題点は次のとおりです。Point

  • あなたが戻っnullた場合、アプリケーションはケースに対処するnull必要があります...またはNPEが発生します.
  • Point「ポイントではない」という意味に使用できる自然なインスタンスはありません。

これは、これらの代替手段を機能させることができなかったと言っているわけではありません。この文脈では、それを行うにはおそらくより多くの作業が必要であり、おそらく具体的な見返りはないでしょう.

于 2013-06-10T02:10:32.513 に答える
2

私はあなたが正しいことをしていると思います: あなたは早期に状態を把握します. それか、「あなたのプログラムにはバグがある。この入力データを 0 で除算してみてください」と文句を言う人がいるでしょう。

99% 以上の状況でこのようなエラーが発生しないことを考えると、これは例外的な条件であり、チェック済みの例外を宣言することは許可されていないため、チェックされていない例外は確かに正しい選択のように見えます。

さて、IllegalArgumentException「良いもの」であるかどうかについては、少なくともこのケースを説明する最も近い例外ですRuntimeException..

一方、 IFでは、この状況はそれほど頻繁ではないため、そもそもこの状態に陥らないように、その関数に到達するためのロジックを検討する必要があるかもしれません。

于 2013-06-10T02:05:22.107 に答える
-1

例外は、入力の検証ではなく、プログラム フロー (「内部で発生すること」) のエラーをキャッチするために使用する必要があります。私はまったく例外をスローしません。考えてみてください。これは「例外」が意味するものではありません。ユーザーが 2 つの線を同じ勾配で入力するのは完全に正常なことだからです。

于 2013-06-10T01:58:17.047 に答える