JavaMail中Folder is not open及OutOfMemory 错误解决办法

1、Folder is not Open 异常


 在运行时,在邮箱邮件比较多的情况下,大概每次在收取大概5分钟左右,就会报下面的异常:
 java.lang.IllegalStateException: Folder is not Open
 at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:422)
 at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:193)
 
 在每次读取一个folder时,先判断是否close,如果close就在重新打开一次,这样就解决了,详见下面的代码:

Message message[] = folder.getMessages();  
 System.out.println("收件箱总数: " + message.length);  
 for (int i = 0; i < message.length; i++) { 
   if(!message[i].getFolder().isOpen()) //判断是否open  
   message[i].getFolder().open(Folder.READ_WRITE) //如果close,就重新open    
 } 

注意:上面的两行注释,每次for循环打开一个新的message时,先判断和这个message里面的folder是否是close的,如果close,就重新打开。 这样,就可以解决Folder is not open异常了。


 2、OutOfMemory 异常


 在收阅邮件中,如果含有大量的附件,并且在时间较长的情况下,会报OutOfMemory 异常。
 方法:POP3Message.invalidate(true);// 使缓存失效
 api如下:
 invalidate
 public void invalidate(boolean invalidateHeaders)Invalidate the cache of content for this message object, causing it to be fetched again from the server the next time it is needed. If invalidateHeaders is true, invalidate the headers as well.

 Parameters:
 invalidateHeaders - invalidate the headers as well?
 
 啥意思,如果是true,就每次不往缓存中添加内容,false还会添加,默认为false的。

Message message[] = folder.getMessages();  
 System.out.println("收件箱总数: " + message.length);  
 for (int i = 0; i < message.length; i++) {    
  if(!message[i].getFolder().isOpen())  
  message[i].getFolder().open(Folder.READ_WRITE);  
 printMessage(message[i]);              
  
 POP3Message)message[i]).invalidate(true); // 每封邮件读取完后,设置不往cache中添加  
  
 } 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值