2015-09-04 176 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)。

相關問題