2015-09-04 142 views
-4

null.equals(null)在我的情况下不抛出NullPointerException。无法理解。在else if条件中的以下代码片段中,basePartNumber和partNumber可能为null。当控制到达并且我在eclipse调查时,我看到一个NullPointerExcption。但它并没有抛出异常,代码继续下一次迭代。可以解释一下为什么null.equals(null)不会抛出NullPointerException

String basePartnumber = null; 
for(Row detailRow:detailRows){ 
String partNumber = AscendRowUtil.getString(detailRow, ASNConstants.BUYER_PART_NUMBER); 
       if(basePartnumber == null){ 
        basePartnumber = partNumber; 
       } else if(!basePartnumber.equals(partNumber)){ 
        validationResult.addMessage(ASNI18nMessageKeys.ERROR_ASN_CANNOT_HAVE_DIFFERENT_PARTNUMBER_ITEMS); 
        break; 
       } 
      } 
+11

如果'basePartnumber'为null,那么'else'块将不会被执行。所以没有NPE – TheLostMind

+0

else只有在basePartnumber不为空时才会被执行,如果你希望这两个sattements得到执行,你可以拥有!basePartnumber.equals(partNumber – user3607869

+0

如果'basePartnumber'在else if中可以为null?如果那是null ,它就会陷入如果部分 –

回答

5

让我们来看看你的代码。因为basePartnumer == null始终为真,所以else部分从未执行,因为basePartnumber = null

String basePartnumber = null; 
... 
if(basePartnumber == null){ 
    basePartnumber = partNumber; 
} else if(!basePartnumber.equals(partNumber)){ 
+0

这通常是写'if(basePartnumber == null){'在'equals'比较之前的块。 +1 –

0

basePartnumber在您的else-if条件中永远不会为null,因为如果它为null,则上面的代码是executet。所以它永远不会达到这一点。 ;)

0
   if(basePartnumber == null){ // 1 
        basePartnumber = partNumber; 
       } else if(!basePartnumber.equals(partNumber)){ // 2 
        validationResult.addMessage(ASNI18nMessageKeys.ERROR_ASN_CANNOT_HAVE_DIFFERENT_PARTNUMBER_ITEMS); 
        break; 
       } 

在你的榜样,1号线将是任何空真实的,因为你使用的其他假设,这是说

if(basePartnumber ==null){ 
    // code here 
}else { 
    if (!basePartnumber .equals(partNumber)){ 
    // code here 
    } 
} 

你行的方式

!basePartnumber.equals(partNumber) 

为空安全(basePartnumber在第2行中绝不为null)。

相关问题