空检查时出现NullPointerException

时间:2013-05-19 19:41:41

标签: java

我搞砸了以下代码无法区分两个代码片段:

String Check=null;

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

以上代码工作正常并打印消息。

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

此代码将抛出NullPointerException。无法区分此Code Please Help。

5 个答案:

答案 0 :(得分:7)

&&运算符是短路,如果没有必要,它不会评估右侧。在这种情况下,有必要:

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

如果Checknull(并且情况属实),您将继续&&之后检查条件,然后获得Check.isEmpty()。由于Checknull,所以它就像null.isEmpty()这是NEP。

为什么?

当两个表达式之间有&&时,如果第一个表达式为false,则答案将始终为false而另一方将不会被选中,但是当第一个表达式为true时,必须继续并检查对方,以了解是否应将所有表达式评估为truefalse

但是当你有:

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

然后将无法到达右侧,因为检查它是多余的。您已经获得false,如果您在右侧获得truefalse并不重要,结果将是false,因为这是{{1} ( FALSE&& WHATEVER = FALSE )。为什么要检查?

This link可能会对您有所帮助。

(我建议您关注Java Naming Conventions并使变量以小写字母开头)。

答案 1 :(得分:1)

&&表示首先评估左侧,如果false则表示整个表达式为false。如果左侧是true,则评估右侧。在你的情况下:

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

如果Checknull,则接下来评估引发Check.isEmpty()的{​​{1}}。

答案 2 :(得分:1)

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

如果Check真的等于null,那么在另一个条件中你只是说null.isEmpty哪个会导致NullPointerException &&因为||是无关紧要而且没有意义你需要if(Check==null || Check.isEmpty()){ //no NullPointerException System.out.println("get Inside") } 代替

{{1}}

答案 3 :(得分:1)

首先让我告诉你logical OR(||) and logical AND(&&)之间的区别。 当您使用logical OR时,如果第一个表达式是TRUEthe second expression is not evaluated;这意味着如果任何一个表达式为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,没有进一步处理为逻辑AND如果其中一个表达式为FALSE则返回FALSE。不评估第二个表达式(Check.isEmpty或任何其他)。没有NPE,因为我们没有在任何空值上调用方法。

第二种情况:

满足第一个条件,因此评估第二个条件,它将NPE抛出为Check = null,并且我们在null值上调用方法。

希望你明白!

答案 4 :(得分:0)

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

在上面,Check为null,因此它会查找下一个抛出NullPointerException的isEmpty条件。