Итак, мы столкнулись и с этой проблемой.
Я посмотрел на реализацию POP3Folder , где вызывается это исключение.
Кажется, что POP3Folder переопределяет finalize () , чтобы выполнить некоторую очистку до того, как объект исчезнет. finalize () переопределяет вызовы close () , который проверяет, открыта ли папка, а если нет, то IllegalStateException , который вы видите, выбрасывается.
Вот почему вы можете видеть это время от времени; это происходит, когда GC приходит посмотреть на ваш объект, и в этот момент папка может быть уже закрыта, поэтому к тому времени, когда finalize () вызывает close () , проверка, если папка открыта, выдаст исключение.
Теперь я не могу говорить, умный это или глупый. Кажется, что код был бы лучше, если бы close () просто игнорировал бы тот факт, что папка уже закрыта и перемещался, вместо того, чтобы генерировать исключение.
POP3Folder принимает параметризованный конструктор. К сожалению, он не является общедоступным или защищенным, поэтому вы не можете просто извлечь его и переопределить метод close () , удалив проверку наличия открытой папки.
Но, поскольку стек вызовов исключений происходит от finalize () , он не должен оставлять опасность для одиночества, поскольку любое исключение, выброшенное из finalize () , обычно только остановить процесс завершения (сборка мусора) для этого объекта, не нанося гораздо большего ущерба.
Хотелось бы увидеть правильное решение этого вопроса.