ArrayList上的java.lang.NullPointerException

ArrayList上的java.lang.NullPointerException,java,arraylist,Java,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 prep

我有以下代码:

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();
      //...
      }
  //...
  }
}

我不知道为什么arraylist是空的,因为我已经检查过它是否包含一些数据。有人知道如何解决这个问题吗?谢谢。

如果列表为空,则不会出现错误。arraylist实际上包含元素,但是元素是
null
,这就是您如何得到
NullPointerException
的结果。如果您演示填充列表的代码,我可能会进一步帮助您

另请注意:不要通过索引遍历列表:使用增强的for语法:


这至少可以消除您对迭代不存在的元素的担忧。对两个平行列表使用相同索引的方式表明,您的设计在这方面也有改进的潜力。您应该有一个包含第一个列表中的字符串和第二个列表中的浮点数的自定义对象列表。

数组列表不是空的,否则您将得到一个索引越界异常(这是不可能在代码中生成的,因为您的循环检查
i
)。但是,数组列表在索引
i
处包含一个
null
对象

按以下方式更改代码以修复错误:

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

您的arraylist
wallMaterialName
在某个索引i处有一个空值。 要知道在什么
索引中
您有
空值
请执行以下测试

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

for(int i=0;i数组列表中的数据为空这意味着
wallMaterialName.get(i)
null
。它显然没有足够的数据…你能添加更多的代码来分析吗?一般来说,我同意foreach循环,但OP同时循环两个列表,所以索引确实很方便。@这是真的,但我的建议是重新设计,而不是用平行列表来建模域。@MarkoTopolnik你是对的,我提到它是为了说明OP评估列表可能是“空”的原因是不正确的。我理解……但它也有可能混淆OP(让他认为IOOBE实际上会与他的代码和空列表一起发生)@user1221330不客气!您可能希望通过单击旁边的复选标记大纲来接受解决问题的答案。这将向其他人表明您没有积极寻找改进的解决方案,并在堆栈溢出时为您赢得一个全新的徽章。
String materialName = wallMaterialName.get(i);
if(materialName != null && materialName.charAt(0) == 'A') ...
for(int i=0; i<al.size(); i++){
            if(al.get(i)==null){
                System.out.println(i);
            }
        }