2011-10-03 50 views
0

我真的很困惑:我只是試圖將ArrayList中的每個對象的名稱添加到另一個ArrayList這是一個nullpointerexception?

for (int i = 0; i < availableParts.size(); i++) { 
    for (int j = 0; j < namesOfIngredients.size(); j++){ 
     if (availableParts.get(i).getName() != namesOfParts.get(j)){ 
      namesOfParts.add(availableParts.get(i).getName()); 
     } 
    }//middle if statement makes sure there are no repeats 
} 

編輯:我知道namesOfIngredients爲null。不過,我需要它開始空 - 這是我如何複製名稱。這可以不這樣做嗎?

+2

你得到一個NPE哪條線路? – Saket

+0

內循環(與j的一個)。 這可能有助於提及namesOfIngredients之前爲空 – varatis

+0

有人可能想要使用調試器? – Romain

回答

0

鑑於你的編輯 - 你怎麼申報namesOfIngredients?

應該

Object namesOfIngredients = new Object(); 

Object namesOfIngredients; 
+0

謝謝。這實際上是我的問題。抱歉沒有提及它是如何初始化的。 – varatis

8

確保

  1. 兩份名單availablePartsnamesOfIngredientsnull
  2. 您要添加的元素(namesOfParts)已被正確地構造函數初始化列表(不null)。
  3. 這些列表內的所有元素都沒有null

請記住,字符串比較與String.equals()完成。在兩個String對象上檢查相等(==)只會返回true,如果它們是相同的實例。

作爲便箋,您可以考慮使用List.contains()以查明某個零件的名稱是否在namesOfIngredients列表中。此外,也許這是一個錯字,但你應該檢查IndexOutOfBoundsExceptionnamesOfParts.get(j)在平等檢查。

3

您正在嘗試查看循環本身中的namesOfParts,但是在循環的定義中,您將使用namesOfIngredients的長度。他們中的一個是否爲空?我打賭一個是。

0

availableParts.get(i)可能爲null,因此getName()調用會導致NPE。

0

我們不知道:我們看不到availablePartsnamesOfParts是如何初始化的。

但我們可以告訴你如何找出答案。添加這樣的打印語句:

print "Before I try it" 
print availableParts.get(i) 
print namesOfParts(availableParts.get(i)) 
print "done" 

當它NPE的你會看到究竟哪一個做了契約。

0

您似乎在循環中調用了很多方法,而沒有檢查您調用它的對象是否爲NULL。它始終是最好這樣做(尤其是,如果你不能確定由給定方法返回的對象的合同)

所以,基本上,只要你這樣做object.method()和/或object.method1().method2(),確保object和/或object.method1()在對其返回值調用後續方法之前不是NULL。

此外,您可以在準確的位置打破按以下方式調用,以更好地調試和捕捉的NPE:

Object returnObj = object.method1(); 
Object anotherReturn = returnObj.method2(); 
相關問題