我有一個程序使用javamail從交換服務器使用imap協議檢索郵件,然後我處理每個看不見的郵件。嘗試打印郵件時出現NullPointerException
最近我遇到了程序拋出nullpointerexception的問題,我知道這是對一個正在調用方法的單元化對象做的,但在這種情況下,它對我沒有任何意義。
該異常的堆棧跟蹤如下:
java.lang.NullPointerException
at com.sun.mail.imap.IMAPFolder.handleResponse(IMAPFolder.java:1905)
at com.sun.mail.iap.Protocol.notifyResponseHandlers(Protocol.java:135
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBodyStructure(IMAPProtocol.java:617)
at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1027)
at com.sun.mail.imap.IMAPMessage.getContentType(IMAPMessage.java:321)
at javax.mail.internet.MimeBodyPart.isMimeType(MimeBodyPart.java:802)
at javax.mail.internet.MimeMessage.isMimeType(MimeMessage.java:851)
at ctt.mail.FileHandler.putFilesFromMail(FileHandler.java:75)
at ctt.mail.FileHandler.main(FileHandler.java:37)
aditionaly我有從最後處理的消息 A607調試跟蹤FETCH 202(FLAGS)
* 202 FETCH (FLAGS (\Seen))
A607 OK FETCH completed.
A608 FETCH 202 (ENVELOPE INTERNALDATE RFC822.SIZE)
* 202 FETCH (ENVELOPE ("Mon, 14 Jul 2014 15:33:56 +0100" "=?iso-8859-1?Q?GPESE_-_ Pr=E9=5FAviso_de_Expedi=E7=E3o?=" (("[email protected]" NIL "SRS0+83ffd8147b51e356=4J=solicitador.net=gpese" "solicitador.net")) NIL NIL (("=?iso-8859-1?Q?RECE=C7=C3O_FICHEIROS_CTT_WINREG?=" NIL "cttwinreg" "ctt.pt")) (("[email protected]" NIL "caraujo" "caso.pt")) NIL NIL "<[email protected]>") INTERNALDATE "14-Jul-2014 15:33:58 +0100" RFC822.SIZE 6462)
A608 OK FETCH completed.
A609 FETCH 202 (BODYSTRUCTURE)
* 202 FETCH (BODYSTRUCTURE (("text" "plain" ("charset" "iso-8859-1") NIL NIL "quoted-printable" 0 0 NIL NIL NIL NIL)("text" "xml" ("name" "GPESE - GE_369515.xml") NIL "GPESE - GE_369515.xml" "base64" 5202 67 NIL ("attachment" ("filename" "GPESE - GE_369515.xml" "size" "3865" "creation-date" "Mon, 14 Jul 2014 14:33:58 GMT" "modification-date" "Mon, 14 Jul 2014 14:33:58 GMT")) NIL NIL) "mixed" ("boundary" "_002_18909390617011405348433043JavaMailgpesesolicitadornet_") NIL "pt-PT"))
* 24457 FETCH (FLAGS (\Seen))
* 24458 FETCH (FLAGS (\Seen))
* 24459 FETCH (FLAGS (\Seen))
* 24460 FETCH (FLAGS (\Seen \Recent))
* 24461 FETCH (FLAGS (\Seen \Recent))
* 24462 FETCH (FLAGS (\Seen \Recent))
A609 OK FETCH completed.
的行拋出異常是在這種情況下調試線:
System.out.println("Mensagem n.º " + i + " de " + (new InternetAddress()).toString(message[i].getFrom()) + " com o assunto " + message[i].getSubject() + " recebida em " + (new SimpleDateFormat("dd/MM/yyyy HH:mm:ss")).format(message[i].getReceivedDate()) + ". Nova? " + msgFlags.contains(javax.mail.Flags.Flag.RECENT) + ". Tem attachments mixed? " + message[i].isMimeType("multipart/mixed") + ". Tem attachments alternative? " + message[i].isMimeType("multipart/alternative") + ". Tem attachments alternative? " + message[i].isMimeType("") + ". O mime type \351? " + message[i].getContentType());
因此,這種情況下的問題是在消息[i] .isMimeType();但根據我的經驗,可以從另一種方法(如message [i] .getFlags())拋出異常。
我測試過消息[我]爲null,它不是空的,這就是爲什麼我不明白爲什麼拋出異常。
任何幫助,將不勝感激。 謝謝。
編輯: 一些額外的堆棧跟蹤異常,我有您正在使用什麼版本的JavaMail的收集
java.lang.NullPointerException
at com.sun.mail.imap.IMAPFolder.handleResponse(IMAPFolder.java:1905)
at com.sun.mail.iap.Protocol.notifyResponseHandlers(Protocol.java:135)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchFlags(IMAPProtocol.java:745)
at com.sun.mail.imap.IMAPMessage.loadFlags(IMAPMessage.java:1093)
at com.sun.mail.imap.IMAPMessage.getFlags(IMAPMessage.java:704)
at ctt.mail.FileHandler.putFilesFromMail(FileHandler.java:58)
java.lang.NullPointerException
at com.sun.mail.imap.IMAPFolder.handleResponse(IMAPFolder.java:1905)
at com.sun.mail.imap.IMAPFolder.handleResponses(IMAPFolder.java:1926)
at com.sun.mail.imap.IMAPMessage.loadEnvelope(IMAPMessage.java:985)
at com.sun.mail.imap.IMAPMessage.getReceivedDate(IMAPMessage.java:278)
at ctt.mail.FileHandler.putFilesFromMail(FileHandler.java:63)
這是一個很好的例子,爲什麼這樣的長線是廢話..它很難調試它們。你也可以檢查變量'msgFlags'爲空。 – Tom 2014-10-10 14:29:03
你是對的一個未初始化的對象可以導致問題;此外,部分初始化的對象也可能導致問題,其中一個錯誤代碼可能無法完全初始化一個對象。所以,一個對象本身可能不爲null,但其成員變量可能是空的。 – KiranCK 2014-10-10 15:05:26