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

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

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

如果Checknull(就是这种情况),您将继续检查 之后的条件&&,然后您会得到Check.isEmpty(). 因为Checkis null,这就像是null.isEmpty()哪一个是 NEP。

为什么?

当两个表达式&&之间存在时,如果第一个为假,则答案始终为假,不检查对方,但当第一个为 时true,您必须继续检查对方才能知道是否所有表达式应该被评估为trueor false

但是当你有:

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

然后将无法到达右侧,因为检查它是多余的。你已经得到了false,如果你得到truefalse在右边都没有关系,结果将是false因为这是一个ANDFALSE && WHATEVER = FALSE)。那为什么要检查呢?

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

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

于 2013-05-19T19:43:39.197 回答
1

&&意味着首先评估左侧,如果false然后整个表达式是false. 如果左侧是true,则评估右侧。在你的情况下:

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

如果Checknull,接下来它会评估Check.isEmpty()哪个 throws NullPointerException

于 2013-05-19T19:44:09.990 回答
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 回答
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。不评估第二个表达式(Check.isEmpty 或其他)。没有 NPE,因为我们没有在任何空值上调用方法。

第二种情况:

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

希望你得到它!

于 2013-05-19T19:50:40.757 回答
0
if(Check==null && Check.isEmpty()){
  System.out.println("get Inside")
}

在上面的检查中,检查为空,因此它会查找下一个条件,即抛出 NullPointerException 的 isEmpty。

于 2013-05-19T19:46:58.570 回答