UF.MAIL

UF (Use Freed) 指摘は、リソースが解放された後にリソースを使用する試みがある場合に報告されます。警告 UF.MAIL は、Java Mail API オブジェクトが閉じられた後にこのオブジェクトの使用を試みていることを示します。

例 1

コピー
 public Collection<Message> getMessages(final Session session,
                                    final String... folderNames) throws MessagingException {
 final Collection<Message> result = new ArrayList<Message>();
 Store store = session.getStore("pop3");
 store.connect();
 
 for (String folderName : folderNames) {
     Folder folder = getFolder(store, folderName);
     if (folder != null) {
         Message messages[] = folder.getMessages();
         for (int i = 0, n = messages.length; i < n; i++) {
             result.add(messages[i]);
         }
     }
 }
 
 return result;
 }
 
 private Folder getFolder(Store store, final String folderName) throws MessagingException {
 if (folderName == null) {
     return null;
 }
 
 try {
     Folder folder = store.getFolder(folderName);
     folder.open(Folder.READ_ONLY);
     return folder;
 } catch (MessagingException e) {
     store.close();
 }
 return null;
 }

UF.MAIL が 20 行目のスニペットについて報告されています。Java Mail API オブジェクト 'store' は、38 行目で MessagingException がスローされた場合にメソッド 'getFolder()' によって閉じられます。このため、サイクルの次の繰り返しでメソッド 'getFolder()' が再度呼び出されると、閉じられたストアにアクセスしようとすることになります。

例 2

コピー
 public Collection<Message> getMessages(final Session session,
                                        final String... folderNames) throws MessagingException {
     final Collection<Message> result = new ArrayList<Message>();
     Store store = session.getStore("pop3");
     store.connect();
 
     for (String folderName : folderNames) {
         Folder folder = getFolder(store, folderName);
         if (folder != null) {
             Message messages[] = folder.getMessages();
             for (int i = 0, n = messages.length; i < n; i++) {
                 result.add(messages[i]);
             }
         }
     }
 
     return result;
 }
 
 private Folder getFolder(Store store, final String folderName) throws MessagingException {
     if (folderName == null) {
         return null;
     }
 
     try {
         Folder folder = store.getFolder(folderName);
         folder.open(Folder.READ_ONLY);
         return folder;
     } catch (MessagingException e) {
         store.close();
         throw e;
     }
 }

前節のスニペットが修正されています。メソッド 'getFolder()' が MessagingExcpetion を再スローするようになりました。