JavaMail-Folder AutoClosable exception



从JavaMail 1.6.0版本开始,类Store和Folder(在Transport中)应该实现AutoClosable接口。

我没有发现任何使用JavaMail API的例子。

经过几次测试后,我不确定如何确切地使用这个功能,因为我发现了一个奇怪的(?)行为。

我正在使用依赖项com.sun.mail:javax.mail:1.6.0

@Test
public static void test() {
Session session = ...;
Intger countOfMessages;
try(Store store = session.getStore("imap");) {
store.connect("<host>", "<user>", "<password>");
try(Folder folder = store.getFolder("inbox");) {
folder.open(Folder.READ_ONLY);
count = folder.getMessages().
}
}
Assert.assertEquals(0, count);
}

到目前为止一切正常。

但是如果我把文件夹的名字改成不正确的值(store.getFolder("_no_folder_with_this_name_"))那么我就会得到

javax.mail.FolderNotFoundException: _no_folder_with_this_name_ not found

完全可以但是这个异常有一个被抑制的异常

Suppressed: java.lang.IllegalStateException: This operation is not allowed on a closed folder

我知道为什么会抛出这个异常。try(Folder folder = store.getFolder(...)抛出FolderNotFoundException,因此文件夹的打开从未发生,并且在close方法中文件夹未打开。但就我个人而言,我不希望出现这种被抑制的例外。作为第二次测试,我试图将内部try块保留为空(try(Folder folder = store.getFolder("inbox");) {}),这样文件夹就不会被打开。即使在这种情况下,也会抛出IllegalStateException。

在1.6.0版本之前,我使用finally语句自己关闭一个文件夹。

finally {
if(folder != null) {
try {
if(folder.isOpen()) {
folder.close(false);
}
}
catch(MessagingException me) { LOG.warn(...); }
if(store != null) {
try {
store.close();
}
catch(MessagingException me) { LOG.warn(...); }
}
}

是我做错了什么还是这个行为是一个bug?

尝试将代码重组为:

@Test
public static void test() {
Session session = ...;
Intger countOfMessages;
Store store = session.getStore("imap");
store.connect("<host>", "<user>", "<password>");
try (store) {   
//try(Store s = store) //For pre JDK9
Folder folder = store.getFolder("inbox");
folder.open(Folder.READ_ONLY);
try (folder) {
count = folder.getMessages();
}
}
Assert.assertEquals(0, count);
}

close方法与connect和open方法相平衡。调用getStore/getFolder并不意味着存在活动连接。如果我们让可自动关闭的呼叫不那么充满敌意,那就更简洁了。

最新更新