3

if ステートメントを次のように書くときに問題があります。

public void foo(List<String> list)
{
     if(list == null || list.isEmpty()){
        // something
     }

     // else
}

リストがnullの場合、リストがnullの場合、list.IsEmpty()は失敗します(例外をスローし、nullオブジェクトでメソッドを呼び出します)。リストはnullです。しかし、私はやっているので|| (または) list が null (true) の場合、2 番目のブロックが実行されます。これは例外をスローします。

これは正しいです?英語では if list if null または empty は意味があります。これはここにありますか?

&& についてはどうですか?または短絡?

ありがとう。

4

4 に答える 4

28

リストがnullの場合、リストがnullの場合、list.IsEmpty()は失敗します(例外をスローし、nullオブジェクトでメソッドを呼び出します)。リストはnullです。

いいえ、そうではありません。||C# と Java の両方の演算子はshortcircuitingです。最初のオペランドが の場合true、2 番目のオペランドは評価されません。

詳細については、Java 言語仕様のセクション 15.24および C# 4 仕様のセクション 7.12 を参照してください。

&&演算子は似ていますが、今回は最初のオペランドが の場合、2 番目のオペランドを評価しませんfalse。したがって、次のように記述しても問題ありません。

if (list != null && list.size() > 0)

逆の条件として。

于 2012-11-05T19:28:38.307 に答える
6

および演算子は短絡評価を行います||&&結果がわかるとすぐに、オペランドの評価を停止します。

これにより、nullチェックの後に値を使用できるようになります。2番目のオペランドが評価されると、変数の状態がわかります。&&これは、演算子よりも演算子でよく使用され||ます。

if (x != null && x.something == 42) ...

|and演算子は&短絡評価を行わないため、両方のオペランドが評価されることが保証されています。

これは、条件内で何かを実行し、次の両方を実行する必要がある場合に役立ちます。

int x, y;
if ((x = GetValue()) != 0 & (y = GetValue()) != 0) {
  // use x
  // use y
}

ただし、条件に副作用があることはコードの臭いであることが多いため、このようなコードはあまり使用されません。

于 2012-11-05T19:30:52.613 に答える
2

通常、マシンは最初に左端の条件を評価し、可能であれば 2 番目の条件をショートカットします。

経験則としては、左端が特定の値であることによって真実が完全に決定できる場合 (この場合、 if が にlist==null評価される場合true)、右部分は無視されます。

于 2012-11-05T19:29:25.123 に答える
2

これが私を悩ませていることです: list が null の場合、 list.IsEmpty() は失敗します

答えはNOです

||ieOR演算子を使用すると、最初の条件が失敗した場合にのみ 2 番目の条件が評価されます。最初の条件が真の場合、2 番目の条件は評価されません。そのShort Circuit動作と呼ばれます。

これは、次の事実によるものです。

  true || any value is always result into true

(AND) でも同じことが起こり&&ますが、反対の条件、つまり最初の条件が失敗した場合、2 番目の条件は次のように評価されません。

   false && any value is always going to be false.

これが動作を理解するのに役立つことを願っています。

于 2012-11-05T19:29:25.343 に答える