我搞砸了以下代码无法区分两个代码片段:
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。
答案 0 :(得分:7)
&&
运算符是短路,如果没有必要,它不会评估右侧。在这种情况下,有必要:
if(Check==null && Check.isEmpty()){
System.out.println("get Inside")
}
如果Check
为null
(并且情况属实),您将继续&&
之后检查条件,然后获得Check.isEmpty()
。由于Check
是null
,所以它就像null.isEmpty()
这是NEP。
为什么?
当两个表达式之间有&&
时,如果第一个表达式为false,则答案将始终为false而另一方将不会被选中,但是当第一个表达式为true
时,必须继续并检查对方,以了解是否应将所有表达式评估为true
或false
。
但是当你有:
if(Check!=null && Check.isEmpty()){
System.out.println("get Inside")
}
然后将无法到达右侧,因为检查它是多余的。您已经获得false
,如果您在右侧获得true
或false
并不重要,结果将是false
,因为这是{{1} ( FALSE&& WHATEVER = FALSE )。为什么要检查?
This link可能会对您有所帮助。
(我建议您关注Java Naming Conventions并使变量以小写字母开头)。
答案 1 :(得分:1)
&&
表示首先评估左侧,如果false
则表示整个表达式为false
。如果左侧是true
,则评估右侧。在你的情况下:
if(Check==null && Check.isEmpty())
如果Check
为null
,则接下来评估引发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
时,如果第一个表达式是TRUE
,the 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条件。