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 并不意味着存在活动连接。 如果我们让可自动关闭的调用不那么敌对的话会更干净。