伙计我原本以为Java忽略了我的空值检查,经过仔细的检查和调试,这是一个愚蠢的代码,这是一个庞大的程序的一部分。我不能发布整个方法,但这应该得到重点。
public class NullCheck {
public static void main(String[] args) {
ArrayList<String>copied = new ArrayList<String>();
copied.add("bg@ascii.com");
copied.add(null);
/* Built MimeMessage msg = new MimeMessage(session); */
InternetAddress[] copiedPeople = new InternetAddress[copied.size()];
for (int i = 0; i < copied.size(); i++)
{
String recCC = (String)copied.get(i);
if ((recCC != null) && (!recCC.equalsIgnoreCase(""))) {
try {
copiedPeople[i] = new InternetAddress((String)copied.get(i));
} catch (AddressException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
// I crash here
// msg.addRecipients(Message.RecipientType.CC, copiedPeople);
}
}
我知道这段代码很好,因为对于前14次迭代来说它没有问题。我再一次认为我的空检查被忽略但它不是!当InternetAddress数组被实例化时,它被设置为[null,null],因此for循环正确地忽略了ArrayList中的第二项,但是当循环完成对addRecepients的调用时,ArrayList仍然具有实例化的第二个空值!我怎么能补救这个?
答案 0 :(得分:0)
您需要使用其他算法。看起来addRecipients不需要任何收件人都为null。在这种情况下,您需要传递一个完全正确长度的数组。最简单的方法是从复制中删除所有null元素,然后将copied.toArray()作为第二个参数传递。
int i = 0;
while(i < copied.size())
{
String recCC = (String)copied.get(i);
if ((recCC == null){
copied.remove(i);
}
else{
i++;
}
}
msg.addRecipients(Message.RecipientType.CC, copied.toArray());
如果你不能改变复制的ArrayList,那么你可以先创建一个新的数组列表,而不是在其中添加空值,然后在没有空值的版本上使用toArray。