gpt4 book ai didi

com.sun.mail.imap.MessageCache.getMessage(MessageCache.java :123) 处出现 java.lang.ArrayIndexOutOfBoundsException

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:21 25 4
gpt4 key购买 nike

我正在从 emailServer 读取电子邮件并将它们保存在数据库中。我正在使用以下代码从电子邮件服务器上的文件夹(“收件箱”)中读取消息并检索与它们对应的消息,但我得到了

"java.lang.ArrayIndexOutOfBoundsException: message number (621) out of bounds (620)
at com.sun.mail.imap.MessageCache.getMessage(MessageCache.java:123)
at com.sun.mail.imap.MessageCache.getMessageBySeqnum(MessageCache.java:153)
at com.sun.mail.imap.IMAPFolder.getMessageBySeqNumber(IMAPFolder.java:2795)
at com.sun.mail.imap.IMAPFolder.getMessagesByUID(IMAPFolder.java:1924)"

我正在使用 javax.mail.1.4.4,这个问题主要出现在收件箱被淹没的时候。

使用的代码:

folder = store.getFolder("INBOX");

folder.open(Folder.READ_WRITE);
// messageUID is uid of last message I saved in DB

Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID);

我做了一些研究,发现文件夹一打开就设置了消息缓存,假设它设置为 520(文件夹的大小)。而如果在设置消息缓存后有任何消息到达,则最后一个消息序列号超过消息缓存的总大小并抛出异常。

谁能告诉我如何获取文件夹中最后一条消息的 UId 的绝对值或如何获取文件夹锁以便在设置缓存后,文件夹不会更新文件夹的大小。

最佳答案

有趣的问题!

首先,我认为这是 javax 邮件中的错误。可能应该调用 checkRange()getMessageBySeqNumber() ,或者只是一个 Math.min()与 vector 大小。

无论如何,问题是代码转到服务器以获取最新的消息计数,但从不更新本地 messageCache。这意味着 messageCache 的数据与该方法相比已过时,但该方法仍假定它是最新的……正如您所看到的那样,欢闹确保了这一点。

现在,如何在修复之前避免它?

不幸的是,我认为您遇到了一些可怕的解决方法,例如:

folder = store.getFolder("INBOX");

folder.open(Folder.READ_WRITE);
// messageUID is uid of last message I saved in DB

/* I apologize for all of the kittens that this code is about to kill */
boolean getMessagesWorked = false;
do {
try {
Message messages[] = ((UIDFolder) folder).getMessagesByUID(messageUID + 1, UIDFolder.LASTUID);
getMessagesWorked = true;
} catch (ArrayIndexOutOfBoundsException e) {
/* Doing this should force the internal messagesCache to get updated
* Unfortunately, this is also somewhat racy, depending on just how
* hard the mail folder is being hit */
try {
folder.getMessage(folder.getMessageCount());
} catch (ArrayIndexOutOfBoundsException e) {
/* There really isn't much you can do here, except try again.
* the good news is that this should hardly ever happen!!
* Good in this case is a relative term! */
}
}
} while (! getMessagesWorked);

关于com.sun.mail.imap.MessageCache.getMessage(MessageCache.java :123) 处出现 java.lang.ArrayIndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13082349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com