以下の 2 つの例を参照してください。両方のクラスに、広く使用されている API ライブラリに属するパブリック メソッドが含まれているとします。
AClass.java
の方が書きやすい (ノイズが少ないため読みやすいかもしれない) が、エラーが検出された場合、スタック トレースの最初のメソッドは内部メソッド ( nullCheck(...)
) であり、例外メッセージはそのメソッドを参照していません。これにより、ユーザーが不必要に混乱する可能性はありますか? ユーザーが考えている意味では、「例外をスローしたのは内部メソッドであり、ライブラリのバグであり、プログラムの障害ではありません。なんて* * 役に立たないライブラリ...」
BClass.java
(すべての if ステートメントで) 書くのはもっと面倒ですが、エラーが検出されると、スタック トレースの最初の行は、エラーが最初に検出された (ユーザーによって呼び出された) API メソッドを特定します。これにより、ユーザーは次のように考える可能性が高くなります:「私は自分のコードからそのメソッドを呼び出しています。私が渡しているパラメーターに何か問題があるに違いありません」.
パブリック API でパラメーターの有効性をチェックするときに例外をスローする方法として、どの方法が適していますか? それとも、2 つの例は等しいと見なされますか?
public class AClass {
public void publicApiMethod1(String a){
nullCheck(a, "a");
// do something...
}
public void publicApiMethod2(String a, String b, String c){
nullCheck(a, "a");
nullCheck(b, "b");
nullCheck(c, "c");
// do something...
}
private void nullCheck(Object a, String argName) {
if(a == null){
throw new NullPointerException("Null argument: " + argName);
}
}
}
public class BClass {
public void publicApiMethod1(String a){
if(a == null){
throw new NullPointerException("Null argument: 'a'");
}
// do something...
}
public void publicApiMethod2(String a, String b, String c){
if(a == null){
throw new NullPointerException("Null argument: 'a'");
}
if(b == null){
throw new NullPointerException("Null argument: 'b'");
}
if(c == null){
throw new NullPointerException("Null argument: 'c'");
}
// do something...
}
}