2014-10-10 138 views
0

我有一个程序使用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) 
+0

这是一个很好的例子,为什么这样的长线是废话..它很难调试它们。你也可以检查变量'msgFlags'为空。 – Tom 2014-10-10 14:29:03

+0

你是对的一个未初始化的对象可以导致问题;此外,部分初始化的对象也可能导致问题,其中一个错误代码可能无法完全初始化一个对象。所以,一个对象本身可能不为null,但其成员变量可能是空的。 – KiranCK 2014-10-10 15:05:26

回答

0

?它看起来像在JavaMail IMAP提供程序中发生NullPointerException。从堆栈跟踪看来,这可能是JavaMail的一个非常旧的版本。

+0

是的,它是一个旧版本。在这种情况下,它是1.4.2。在生产环境中,我甚至不知道,但它也很旧。 – hugob0ss 2014-10-13 10:12:29

+0

堆栈跟踪中的行号与1.4.2版本的JavaMail中的行号不匹配。您可能遇到了旧版JavaMail中的错误,或者您的服务器中存在一个旧版JavaMail处理不好的错误,但我无法确定,因为我无法确定哪个版本你真的在使用。你可以试试[当前版本](https://java.net/projects/javamail/pages/Home),看看它是否更好? – 2014-10-13 18:29:16

相关问题