[解決済み] クライアントの観点からは有効な入力が無効な場合、どの例外を投げるべきか
質問
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"を意味するために使用される可能性があります。
これは、これらの代替案をうまく作れないと言うことではありません。 ただ、この文脈では、次のようになります。 おそらく その分手間がかかるし おそらく 目に見える形で見返りがあるわけではありません。
関連
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】javaで無効な文字定数
-
[解決済み】Javaの".class expected "について
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?
-
[解決済み] Javaで、サポートされていない/実装されていない操作に対して投げる標準的な例外は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】リンクリストの負の値の数でnegativeCntrを代入する
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】JLabelのテキストを中央に配置するには?
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み] Hide Utility Class Constructor : ユーティリティクラスはパブリックまたはデフォルトコンストラクタを持つべきではありません。
-
[解決済み】CreateProcess error=2, The system cannot find file specified.
-
[解決済み] 検索メソッドは、戻り値を生成できない場合、'null'を返すか、例外を投げるべきですか?[クローズド]