繁体   English   中英

空检查时出现NullPointerException

[英]NullPointerException on Null Check

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

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。

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

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因为这是一个ANDFALSE && WHATEVER = FALSE )。 为什么要检查?

此链接可能对您有所帮助。

(我建议您遵循Java命名约定并使变量以小写开头)。

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

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

如果Checknull ,则接下来它会计算抛出NullPointerException Check.isEmpty()

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

如果Check真的等于null,那么在另一个条件中你只是说null.isEmpty哪个会导致NullPointerException因为&&是无关紧要而且没有意义你需要|| 代替

if(Check==null || Check.isEmpty()){
  //no NullPointerException
  System.out.println("get Inside")
}

首先让我告诉你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情况下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 ,我们得到一个NPE(Null Pointer Exception) when we try to call methods upon variables whose value = null

所以在第一种情况下:

Check!= null:第一个条件为false,没有进一步处理为逻辑AND如果其中一个表达式为FALSE则返回FALSE。 不评估第二个表达式(Check.isEmpty或任何其他)。 没有NPE,因为我们没有调用任何null值的方法。

第二种情况:

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

希望你明白!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM