使用以下代码,我只想获取与主题行匹配的电子邮件。
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
,我尝试了equals
和equalsIgnoreCase
,但问题仍然存在。
在没有条件的情况下仅打印主题行时,它显示null
作为主题行。所以我尝试了下面的内容。
else if (messages[i].getSubject().contains("null")) {
System.out.println(messages[i].getSubject() + "\t"
+ messages[i].getSentDate());
}
但错误仍然相同。
请让我知道如何解决这个问题。
答案 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)
如果null
或NullPointerException
为messages[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());
}