2

私は以下のコードで混乱しています 2つのコードスニペットを区別できません:

String Check=null;

if(Check!=null && Check.isEmpty()){
  System.out.println("Get Inside");
}

上記のコードは正常に動作し、メッセージを出力します。

if(Check==null && Check.isEmpty()){
  System.out.println("get Inside")
}

このコードは NullPointerException をスローします。このコードを区別できません 助けてください。

4

5 に答える 5

7

&&演算子はshort-circuitであり、必要でない場合は右辺を評価しません。この場合、次のことが必要です。

if(Check==null && Check.isEmpty()){
  System.out.println("get Inside")
}

Checkである場合null(そしてその場合)、 の後に引き続き条件をチェックする&&と、 が得られCheck.isEmpty()ます。Checkであるため、どちらが NEP であるnullかのようです。null.isEmpty()

なんで?

2 つの式&&の間に がある場合、最初の式が false の場合、答えは常に false になり、反対側はチェックされませんが、最初の式がtrueの場合は、引き続き反対側をチェックして、すべての式はtrueまたはに評価される必要がありますfalse

しかし、次の場合:

if(Check!=null && Check.isEmpty()){
     System.out.println("get Inside")
}

すると、チェックするのは冗長なので、右辺には到達しません。あなたはすでに を得ており、あなたが得るか右側にあるfalseかは関係ありません。これは( FALSE && WHATEVER = FALSE ) であるため、結果は次のようになります。では、なぜチェックするのでしょうか。truefalsefalseAND

このリンクが役立つ場合があります。

( Java 命名規則に従い、変数を小文字で始めることをお勧めします)。

于 2013-05-19T19:43:39.197 に答える
1

&&false式全体がである場合、最初に左側を評価することを意味しfalseます。左辺が の場合true、右辺を評価します。あなたの場合:

if(Check==null && Check.isEmpty())

Checkである場合null、次にCheck.isEmpty()どちらがスローされるかを評価しNullPointerExceptionます。

于 2013-05-19T19:44:09.990 に答える
1

最初に の違いを教えてくださいlogical OR(||) and logical AND(&&)。を使用するlogical OR場合、最初の式がTRUE,の場合the second expression is not evaluated; つまり、いずれか 1 つの式が TRUE の場合、条件が満たされ、フローはループに入ります。しかし、の場合AND, all the expressions must satisfy to TRUE to satisfy the condition。また、式のいずれかが FALSE と評価された場合、条件は満たされていません。

また、覚えておいてNPE(Null Pointer Exception) when we try to call methods upon variables whose value = nullください。

したがって、最初のケースでは:

Check != null : 最初の条件は false です。式の 1 つが FALSE の場合、論理 AND は FALSE を返すため、それ以上の処理は行われません。2 番目の式は評価されません (Check.isEmpty など)。null 値に対してメソッドを呼び出していないため、NPE はありません。

2 番目のケース:

最初の条件が満たされるため、NPE を Check = null としてスローする 2 番目の条件が評価され、null 値に対してメソッドが呼び出されます。

あなたがそれを得る願っています!

于 2013-05-19T19:50:40.757 に答える
1
if(Check==null && Check.isEmpty())

Check が実際に null に等しい場合、他の条件では、代わりに必要だったのは無関係で無意味であるため、null.isEmptyどちらのコースにつながるかを言っているだけですNullPointerException&&||

if(Check==null || Check.isEmpty()){
  //no NullPointerException
  System.out.println("get Inside")
}
于 2013-05-19T19:49:24.483 に答える
0
if(Check==null && Check.isEmpty()){
  System.out.println("get Inside")
}

上記では Check is null なので、NullPointerException をスローする isEmpty である次の条件を検索します。

于 2013-05-19T19:46:58.570 に答える