2014-10-10 2 views
0

У меня есть программа, которая использует javamail для извлечения сообщений с сервера обмена с использованием протокола imap, а затем обрабатываю все невидимые сообщения.NullPointerException при попытке распечатать почтовое сообщение

Недавно я столкнулся с проблемой программы, бросающей nullpointerexception. Я знаю, что это делается для объекта-объекта, который вызывает метод, но в этом случае это не имеет никакого смысла для меня.

StackTrace за исключением выглядит следующим образом:

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 (ФЛАГОВ)

* 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().

Я протестировал сообщение [i] для null, и это не null, вот почему я не понимаю, почему выбрано исключение.

Любая помощь будет оценена по достоинству. Спасибо.

редактировать: Некоторые дополнительные стека исключений трассировки, я собрал

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) 
+0

Это прекрасный пример, почему такие длинные строки - это дерьмо .. его трудно отладить. Вы также можете проверить переменную 'msgFlags' на null. – Tom

+0

Вы правы, неинициализированный объект может вызвать проблему; Кроме того, частично инициализированные объекты также могут вызывать проблему, когда багги-код может не полностью инициализировать объект. Таким образом, объект может быть не нулем сам по себе, но его переменные-члены могут быть. – KiranCK

ответ

0

Какая версия JavaMail вы используете? Похоже, что NullPointerException происходит в JavaMail IMAP-провайдере. Из трассировки стека это выглядит как очень старая версия JavaMail.

+0

Да, это старая версия. В этом случае это 1.4.2. В производственных условиях я даже не знаю, но он тоже старый. – hugob0ss

+0

Номера строк в трассировке стека не соответствуют номерам строк в версии 1.2.2 JavaMail. Возможно, вы столкнулись с ошибкой в ​​более старой версии JavaMail или ошибкой на вашем сервере, когда более старая версия JavaMail плохо обрабатывается, но я не могу точно сказать, потому что не могу сказать, какую версию вы действительно используете. Можете ли вы попробовать [текущую версию] (https://java.net/projects/javamail/pages/Home), чтобы узнать, работает ли это лучше? –

Смежные вопросы