JavaMail-Folder AutoClosable异常
JavaMail-Folder AutoClosable exception
Since JavaMail version 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,因此永远不会打开文件夹,并且在关闭方法中文件夹不会打开。但就我个人而言,我不希望出现这种被抑制的异常。作为第二个测试,我试图将内部 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(...); }
}
}
我是不是做错了什么或者这个行为是一个错误?
尝试将代码重组为:
@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 并不意味着存在活动连接。
如果我们让可自动关闭的调用不那么敌对的话会更干净。
Since JavaMail version 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,因此永远不会打开文件夹,并且在关闭方法中文件夹不会打开。但就我个人而言,我不希望出现这种被抑制的异常。作为第二个测试,我试图将内部 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(...); }
}
}
我是不是做错了什么或者这个行为是一个错误?
尝试将代码重组为:
@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 并不意味着存在活动连接。 如果我们让可自动关闭的调用不那么敌对的话会更干净。