3

メソッドがあるとします。

MyClass myMethod(MyClass input){
    //body of method
}

この方法が正確にどこで使用されるか分からないと仮定します。入力が null の場合、例外をスローするか、単に null 値を返すかを決定するにはどうすればよいですか?

次のような方法についても同じ質問があります

void myMethod(MyClass input){
    //body of method
}

入力がnullの場合、何も実行せずに戻るか、例外をスローするか、System.error()と言うべきですか?

私は自分のプロジェクトにこれらすべてを使用しました。ほとんどのクラスには public メソッドがほとんどないため、すべて正常に機能します。

4

7 に答える 7

1

入力が null であると実行中にコードでエラーが発生する場合は、例外 (IllegalArgumentException など) をスローする必要があります。それ以外の場合は、null を返すことができます。

于 2013-02-19T05:55:02.483 に答える
1

null 入力は例外的な状況ですか、それとも合理的に正常な動作ですか? 例外的な動作の場合は、例外をスローします。発生することが予想される場合は、返品を検討してnullください。

于 2013-02-19T05:38:47.253 に答える
1

入力が null の場合、例外をスローするか、単に null 値を返すかを決定するにはどうすればよいですか?

自問してみてください、null有効な入力ですか? はいの場合、例外をスローせず、論理的に処理します。いいえの場合、例外をスローします。

ここでの有効な意味は次のとおりです。オブジェクトにいくつかの値を格納していて、それらのいくつかはオプションであるとしましょう。つまり、ユーザーはそこに値を提供する場合と提供しない場合があります。その場合null、それらのフィールドに対してのみ有効になりますが、必須フィールドに対してnullは受け入れられません。

同様の考え方を問題に適用すると、結論に達する可能性があります。

別の例: そのメソッドへの入力が であるファイルを開いているとしましょうfilePath。指定されたパスが null の場合は無効であり、例外がスローされます。

于 2013-02-19T05:49:09.273 に答える
0

メソッドが null 引数で呼び出されることが想定されていない場合は、NullPointerException (略して NPE) をスローしても問題ありません。これは、input!=null が前提条件であり、呼び出し元が事前に確認しておく必要があるためです。

/** My method.
  * @param input the input, must not be null.
  */
void myMethod(MyClass input){
  if (input==null) throw new NullPointerException();
  //...
}

プログラムの分岐数をインクリメントせずに NPE をスローする一般的なイディオムは次のとおりです。

void myMethod(MyClass input){
  input.getClass(); //NPE if input is null
  //...
}

場合によっては、上記のチェックがコード内で暗黙的に行われます。

void printLowercase(String input){
  System.out.println(input.toLowerCase());
}

メソッドが失敗したかどうかを呼び出し元が認識しにくくなるため、サイレントに失敗するメソッドの実装は避けてください。代わりに、ブール値を返します。

boolean myMethod(MyClass input){       
   if (input==null) {
       //you may log that the input was null
       return false;
   }
   //...
   return true;
}
于 2013-02-19T05:55:54.840 に答える
0

答えは

教えて、聞かないで

アイデアは、何らかの値を返すか例外をスローするかを決定できるオブジェクトにエラー処理を委譲することです。

あなたができるよりもメソッドの署名を制御できる場合

MyClass myMethod(MyClass input, Expectation whenInputIsNull){
    if(input==null) {
        // might also throw
        return whenInputIsNull.handle();
    }
    //body of method
}

メソッド シグネチャを制御できない場合はExpectation、 を の所有クラスのメンバーとして配置できますmyMethod

それは読むのがとてもいいです:

foo.myMethod(input, Expect.nullReturned());
foo.myMethod(input, Expect.throwIllegalArgumentException());

これをリポジトリで使用すると、非常に便利です。

fooRepository.findByBar(bar, Expect.atLeast(5));
于 2013-02-19T06:57:35.223 に答える
0

一般に、どこでも null を許可しないでください。生活が苦しくなるだけです。Java を使用すると、このアドバイスに従うのが難しくなりますが、持っているものでできることを実行してください。

于 2013-02-19T05:34:19.713 に答える
-1

これは議論の余地のある質問です。問題のドメインを考慮して、使用するのに最適なものを選択するといいでしょう。

いずれにせよ、そのような入力に対するコードの動作を (簡潔な Javadoc を使用して) 明確に文書化し、API のユーザーが予期しない動作に驚かされないようにしてください。

于 2013-02-19T06:01:06.440 に答える