null主题行给出空指针异常

时间:2015-07-21 10:34:11

标签: java javamail

使用以下代码,我只想获取与主题行匹配的电子邮件。

String subject = "test email";
    Properties props = System.getProperties();
    props.setProperty("mail.store.protocol", "imaps");
    try {
        Session session = Session.getDefaultInstance(props, null);
        Store store = session.getStore("imaps");
        store.connect(host, userName, password);
        Folder inbox = store.getFolder("Inbox");
        inbox.open(Folder.READ_ONLY);
        int count = inbox.getMessageCount();
        System.out.println(count + " total messages");
        Message messages[] = inbox.getMessages();
        for (int i = 0; i < messages.length; i++) {
            if (messages[i].getSubject().contains(subject)) {
                System.out.println(messages[i].getSubject() + "\t"
                        + messages[i].getSentDate());
            } else {
                System.out.println("subject mismatch");
            }
        }

这里我得到了所需的结果,但是当有没有主题行的电子邮件时,问题就会出现。

我尝试了下面的内容。

else if (messages[i].getSubject().contains(null)) {
                    System.out.println(messages[i].getSubject() + "\t"
                            + messages[i].getSentDate());
                }


else if (messages[i].getSubject().contains("")) {
                    System.out.println(messages[i].getSubject() + "\t"
                            + messages[i].getSentDate());
                }


else if (messages[i].getSubject().contains(" ")) {
                    System.out.println(messages[i].getSubject() + "\t"
                            + messages[i].getSentDate());
                }

但我仍然得到以下错误

java.lang.NullPointerException
    at com.getEmails.readEmails.main(readEmails.java:34)

也代替contains,我尝试了equalsequalsIgnoreCase,但问题仍然存在。

在没有条件的情况下仅打印主题行时,它显示null作为主题行。所以我尝试了下面的内容。

else if (messages[i].getSubject().contains("null")) {
                        System.out.println(messages[i].getSubject() + "\t"
                                + messages[i].getSentDate());
                    }

但错误仍然相同。

请让我知道如何解决这个问题。

4 个答案:

答案 0 :(得分:2)

问题在于,无论getSubject()产量有时可能是null,因此无论您执行何种类型的检查,对此的任何操作都将产生NullPointerException

要解决此问题,您需要进行 null check ,如下所示:

        for (int i = 0; i < messages.length; i++) {
            if ((messages[i].getSubject() != null) && (messages[i].getSubject().contains(subject))) {
                System.out.println(messages[i].getSubject() + "\t"
                        + messages[i].getSentDate());
            } else {
                System.out.println("subject mismatch");
            }
        }

答案 1 :(得分:1)

如果nullNullPointerExceptionmessages[i],您应首先检查messages[i].getSubject(),因为它会null。除此之外,contains(null)没有任何意义,必须NullPointerException,但messages[i].getSubject() == null确实有意义。

答案 2 :(得分:1)

messages[i] != null && messages[i].getSubject() != null && messages[i].getSubject().contains(subject)

答案 3 :(得分:0)

除了其他人所说的内容之外,您可能需要考虑使用Folder.search方法和SubjectTerm,这样可以在服务器上进行搜索:

Message[] messages = inbox.search(new SubjectTerm(subject));
for (int i = 0; i < messages.length; i++) {
    System.out.println(messages[i].getSubject() + "\t"
                    + messages[i].getSentDate());
}