空主题行给出空指针异常

null subjectline giving null pointer exception

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

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)

我也尝试了 equalsequalsIgnoreCase 而不是 contains,但问题仍然相同。

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

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

但错误还是一样。

请告诉我如何解决这个问题。

您应该首先检查 null,因为如果 messages[i]messages[i].getSubject()null,它将给出 NullPointerException。除此之外 contains(null) 没有任何意义并且必须导致 NullPointerExceptionmessages[i].getSubject() == null 确实有意义。

问题是,无论 getSubject() 产生的结果有时可能是 null,因此无论您进行何种类型的检查,对其进行的任何操作都会产生 NullPointerException

要解决此问题,您需要进行 空检查 ,类似于:

        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");
            }
        }
messages[i] != null && messages[i].getSubject() != null && messages[i].getSubject().contains(subject)

除了其他人所说的,您可能还想研究使用 Folder.search method with a 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());
}