Java 空检查时的NullPointerException

Java 空检查时的NullPointerException,java,Java,我被下面的代码搞乱了,无法区分这两个代码段: String Check=null; if(Check!=null && Check.isEmpty()){ System.out.println("Get Inside"); } 上面的代码工作正常,可以打印消息 if(Check==null && Check.isEmpty()){ System.out.println("get Inside") } 此代码将引发NullPointerExceptio

我被下面的代码搞乱了,无法区分这两个代码段:

String Check=null;

if(Check!=null && Check.isEmpty()){
  System.out.println("Get Inside");
}
上面的代码工作正常,可以打印消息

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

此代码将引发NullPointerException。无法区分此代码,请帮助。

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

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
,因为这是一个
(false&&where=false)。那为什么要检查

也许对你有帮助


(我建议您遵循并使变量以小写字母开头)。

&
表示首先计算左侧,如果
false
,则整个表达式为
false
。如果左侧为
true
,则对右侧进行求值。就你而言:

if(Check==null && Check.isEmpty())
如果
Check
null
,则接下来它将计算
Check.isEmpty()
,该函数将抛出
NullPointerException

if(Check==null && Check.isEmpty()){
  System.out.println("get Inside")
}
在上面的代码中,检查为null,所以它会继续查找下一个抛出NullPointerException的条件isEmpty

if(Check==null && Check.isEmpty())
如果Check在另一个条件中真的等于null,那么您只是说
null.isEmpty
这当然会导致
NullPointerException
,因为
&
与您需要的
|
无关且毫无意义

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

首先让我告诉你
逻辑OR(| |)和逻辑and(&&)
之间的区别。 使用
逻辑或
时,如果第一个表达式为
则不计算第二个表达式
;这意味着,如果任何一个表达式为真,则满足条件,流将进入循环。但是在
和的情况下,所有表达式必须满足TRUE才能满足条件
。如果表达式中的任何一个计算结果为FALSE,则不满足条件

还请记住,当我们试图对值为Null的变量调用方法时,会得到一个
NPE(Null指针异常)

因此,在第一种情况下:

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

第二种情况:

第一个条件得到满足,所以对第二个条件进行求值,该条件将NPE抛出为Check=null,并且我们是对null值的调用方法


希望你得到它

记住这一点:==!==@dirkk实际上
==
很好(从不会引发异常的意义上讲)。这张支票不会抛出NPE。问题是,对另一方进行求值,然后抛出NPE。@marounnaroun当然,我用“this”引用了整个语句。我只是认为这很明显,因为您首先检查
check
为空,然后访问此元素。谢谢先生!我喜欢你的回答,因为我对那些片段感到困惑。现在我知道了为什么它会抛出错误。欢迎你,我的朋友,我很高兴它帮助了你,如果你愿意,你当然可以接受:)