2012-10-29 80 views
2

我有以下代碼:顯示java.lang.NullPointerException上的ArrayList

for (int i=0; i<wallMaterialName.size(); i++){ 
if (Math.abs(calculatedWallUValue - alternativeWallUValue) > 0.01){ 
    if(wallMaterialName.get(i).charAt(0) == 'A'){     //*****ERROR IN HERE***** 
     PreparedStatement prepStateMat = con.prepareStatement("select * from concretestonefloor where value<? order by value desc limit 1"); 
     prepStateMat.setFloat(1, (Float)wallMaterialLambda.get(i)); 
     ResultSet rsMaterial = prepStateMat.executeQuery(); 
     //... 
     } 
    //... 
    } 
} 

當我運行的代碼, 「顯示java.lang.NullPointerException」 出現。 誤差來源於此代碼:

if(wallMaterialName.get(i).charAt(0) == 'A') 

我不知道爲什麼,因爲我已經檢查了它包含了一些數據ArrayList中是空的。任何人都知道如何解決這個問題?謝謝。

+0

arraylist中的數據爲空 – Alex

+0

這意味着'wallMaterialName.get(i)'是'null'。 – Jesper

+0

它顯然沒有包含足夠的數據... – Thilo

回答

6

數組列表不是空的,否則你會得到一個超出範圍的異常(這是不可能在你的代碼中產生的,因爲你的循環檢查i < wallMaterialName.size())。但是,您的數組列表包含索引爲inull對象。

String materialName = wallMaterialName.get(i); 
if(materialName != null && materialName.charAt(0) == 'A') ... 
+0

@MarkoTopolnik你說得對,我提到它是爲了說明OP爲什麼評估該列表可能是「空白」的原因是不正確的。 – dasblinkenlight

+0

我明白......但它也有可能混淆OP(讓他認爲一個IOOBE實際上會發生在他的代碼和一個空列表中)。 –

+0

@dasblinkenlight您的代碼解決了我的問題。非常感謝。 – user1221330

2

如果列表爲空,則不會收到錯誤。數組列表實際上包含元素,但元素是null,這就是你如何以NullPointerException結束。如果您演示填充列表的代碼,我可以進一步幫助您。

在一個單獨的說明:不通過索引遍歷列表:使用增強了語法:

for (String element : wallMaterialName) ... 

這將至少消除對遍歷一個不存在的元素您的後顧之憂。您對兩個並行列表使用相同索引的方式表明,您的設計在這方面也有改進的潛力。您應該有一個自定義對象的列表,其中包含第一個列表中的字符串和第二個列表中的浮動元素。

+0

一般來說,我同意foreach循環,但OP同時循環兩個列表,所以索引確實派上用場。 – Thilo

+0

@Thilo True,但我的建議是再次重新設計,而不是使用並行列表對域進行建模。 –

0

ArrayList中wallMaterialName有一些索引i空值:

如下修正錯誤更改代碼。 要知道你有什麼index你有null value做下面的測試。

for(int i=0; i<al.size(); i++){ 
      if(al.get(i)==null){ 
       System.out.println(i); 
      } 
     } 
相關問題