2013-05-19 56 views
2

我搞砸了与下面的代码能不能在两个代码片段区分:NullPointerException异常对空检查

String Check=null; 

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

上面的代码工作正常,并打印消息。

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

此代码将抛出NullPointerException.Not能够区分此代码请帮助。

+0

记住这个: ==!=!= –

+0

@dirkk其实'=='很好(在它不会引发异常的意义上)。这项检查不会引发NPE。问题是另一方被评估,然后NPE被抛出。 – Maroun

+0

@MarounMaroun当然,用“这个”我提到了整个陈述。我只是觉得这很明显,因为你首先检查'Check'是否为null,然后访问这个元素。 – dirkk

回答

7

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

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

如果Checknull(这就是这种情况),你会继续&&后检查的条件,你会得到Check.isEmpty()。由于Checknull,这就像是NEP的null.isEmpty()

为什么?

当两个表达式,它们之间&&,如果第一个是假的,答案永远是假的,对方将不检查,但是当第一个是true,你必须继续检查其他方面知道是否所有的表达应评估为truefalse

但是如果你有:

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

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

This link可能会帮助你。

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

+0

谢谢先生!我喜欢你的答案,因为我对那些片段感到困惑。现在我明白了为什么它会抛出错误。 –

+0

Your're欢迎我的朋友,我很高兴它帮助你,当然你可以接受它,如果你想:) – Maroun

1

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

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

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

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

在上述检查为空如此这般,并期待下一次的条件是的isEmpty抛出NullPointerException异常。

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

如果真的检查等于null中其他条件,你只是说null.isEmpty这ofcourse将导致NullPointerException因为&&是无关紧要的,毫无意义的,你需要||代替

if(Check==null || Check.isEmpty()){ 
    //no NullPointerException 
    System.out.println("get Inside") 
} 
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

所以在第一种情况:

检查=零:第一个条件是假的,没有进一步的处理逻辑,并返回FALSE,如果一个表达是FALSE。不评估第二个表达式(Check.isEmpty或任何其他)。没有NPE,因为我们不在任何空值上调用方法。

第二种情况:

第一条件被满足,因此第二个条件评估会抛出NPE作为检查=零,我们是在一个空值调用方法。

希望你明白!