InternetAddress的实例化虽然检查导致NPE

时间:2014-02-06 02:31:55

标签: java nullpointerexception javax.mail

伙计我原本以为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仍然具有实例化的第二个空值!我怎么能补救这个?

1 个答案:

答案 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。