4

以下の 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...
}
}
4

4 に答える 4

5

エラー メッセージが説明的である場合 (そして説明的である場合)、誰もスタック トレースを見ようとはしません。したがって、検証ロジックがカプセル化されているため、最初の形式の方が優れています。

すぐに使用できるさまざまなライブラリに多数のアサーション メソッドがあることに注意してください。参照:Objects.requireNonNullおよびValidate.notNull)。

于 2012-05-29T22:00:11.007 に答える
2

基本的にあなたに基づいて、私はそのようにしますAClass

public void publicApiMethod2(String a, String b, String c){
    try {
        nullCheck(a, "a");
        nullCheck(b, "b");
        nullCheck(c, "c");
    }
    // catch the NullPointerException,
    // and any other Exception explicitly thrown by your validation methods
    catch (NullPointerException e) { 
         throw new IllegalArgumentException(e.getMessage());
    }
    // do something...
} 

こうすることで、ユーザーは明示的なメッセージ、パブリック メソッドを指すスタック トレースを取得します。

于 2012-05-29T22:04:03.770 に答える
1

で明確に文書化する限り、クラス A は問題ないと思います@throws。スタックの奥深くにスローされるライブラリをたくさん見てきました。重要なことは、ユーザーがエラーがスローされた理由と、それを回避するために何ができるかを理解することです。

于 2012-05-29T22:04:24.647 に答える
1

あなたのbクラスでは、なぜあなたは使わないのですか

if( (c == null)|| (b == null)|| (a == null) ){
 //thrown my red ball
 }

疲れにくく、読みやすい

于 2012-05-29T21:57:57.310 に答える