2

正如标题所说,当尝试执行 folder.open() 时,它会失败,但不会引发错误,因此很难找到原因。在我的调试控制台中,确实出现了以下错误,但它可能/可能不相关(这仅在 folder.open() 断点后按恢复后显示)。

我正在使用适用于 Android 的 JavaMail API 进行开发。IMAP 服务器一切正常,但我还需要能够连接到 POP3 邮件服务器。连接的商店是 GMAIL,我的 GMAIL 帐户上的所有必要设置都已更改。

04-12 13:22:26.682: INFO/dalvikvm(436): Ljava/lang/IllegalStateException;: Folder is not Open
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.checkOpen(POP3Folder.java:512)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.close(POP3Folder.java:227)
04-12 13:22:26.682: INFO/dalvikvm(436):     at com.sun.mail.pop3.POP3Folder.finalize(POP3Folder.java:506)
04-12 13:22:26.682: INFO/dalvikvm(436):     at dalvik.system.NativeStart.run(Native Method)

pop3的连接方法如下:

String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        Properties pop3Props = new Properties();

        pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
        pop3Props.setProperty("mail.pop3.port",  "995");
        pop3Props.setProperty("mail.pop3.socketFactory.port", "995");

        URLName url = new URLName("pop3", "pop.gmail.com", 995, "",
                "******@googlemail.com", "*****");

        //session = Session.getInstance(pop3Props, null);
        Session session = Session.getInstance(pop3Props, new javax.mail.Authenticator() 
        {   
            protected PasswordAuthentication getPasswordAuthentication() 
            {
                return new PasswordAuthentication("***********", "*****");
            }
        });

        session.setDebug(true);

        store = new POP3SSLStore(session, url);
        store.connect();

连接店铺的方法如下(遇到问题的地方):

folders = store.getFolder("INBOX");
        //Folder folder = store.getFolder("INBOX");
        if (folders.isOpen()) 
        {
            if ((folders.getMode() & Folder.READ_WRITE) != 0) 
            {
                folders.close(false);
                folders.open(Folder.READ_ONLY);
            }
        } 
        else 
        {
            try
            {
                folders.open(Folder.READ_ONLY);
            }
            catch (Exception e)
            {
                Log.i("Folder Opening,", e.toString());
            }
        }

任何想法都会有所帮助!会话已被调试,没有明显的问题。如果您需要更多信息来帮助您,请不要犹豫!我确定我不是唯一遇到这个问题的人。

谢谢!里斯

4

1 回答 1

4

所以,我们也遇到了这个问题。

我查看了触发该异常的POP3Folder的实现。

似乎POP3Folder正在覆盖finalize()以便在对象不存在之前执行一些清理。finalize()覆盖调用close()来检查文件夹是否打开,如果不是,则抛出您看到的IllegalStateException 。

这就是为什么您可能会偶尔看到它;它发生在GC来查看您的对象时,此时文件夹可能已经关闭,所以当finalize()调用close()时,检查文件夹是否打开将抛出异常。

现在,我不能说这是聪明还是愚蠢。如果close()只是忽略文件夹已经关闭并继续前进的事实,而不是抛出异常,代码似乎会更好。

POP3Folder采用参数化构造函数。不幸的是,它不是公共的或受保护的,因此您不能简单地从它派生并覆盖close()方法,从而删除对文件夹是否打开的检查。

但是,由于异常调用堆栈源自finalize(),因此它应该减少不理会的危险,因为从finalize()抛出的任何异常通常只会停止该对象的终结过程(垃圾收集),而不会导致更多的伤害。

不过,希望看到一个适当的解决方案。

于 2011-08-12T05:32:09.560 回答