空主题行给出空指针异常
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)
我也尝试了 equals
和 equalsIgnoreCase
而不是 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)
没有任何意义并且必须导致 NullPointerException
但 messages[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());
}
使用下面的代码,我试图只获取与主题行匹配的电子邮件。
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)
我也尝试了 equals
和 equalsIgnoreCase
而不是 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)
没有任何意义并且必须导致 NullPointerException
但 messages[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());
}