UF.SQLOBJ

UF (Use Freed) 問題は、リソースが解放された後にリソースを使用する試みがある場合に報告されます。警告 UF.SQLOBJ は、JDBC オブジェクト (文、プリペアド文、結果セットなど) が閉じられた後にこのオブジェクトの使用を試みていることを示します。

例 1

28    public List<String> order() {
29         final List<String> strings = new ArrayList<String>();
30         populate(strings, 1, 3, 5, 7, 9);
31         return strings;
32     }
33 
34     public void populate(List<String> data, int... keys) {
35         try {
36             try {
37                 ps = conn.prepareStatement("SELECT * FROM Table where key=?");
38                 for (int key : keys) {
39                     populate(data, key);
40                 }
41             } finally {
42                 ps.close();
43             }
44         } catch (SQLException e) {
45             // do nothing
46         }
47     }
48 
49     public void populate(List<String> data, int key) {
50         try {
51             ps.setInt(1, key);
52             final ResultSet rs = ps.executeQuery();
53             try {
54                 while (rs.next()) {
55                     String s = rs.getString(1);
56                     data.add(s);
57                 }
58             } finally {
59                 rs.close();
60             }
61         } catch (SQLException e) {
62             try {
63                 ps.close();
64             } catch (SQLException e1) {
65                 // do nothing
66             }
67         }
68     }

UF.SQLOBJ が 39 行目のスニペットについて報告されています。 サイクルの繰り返しごとに 39 行目でメソッド 'populate(List<String>String data, int... keys)' が呼び出されています。SQLException がスローされた場合、このメソッドはプリペアド文 'ps' を閉じます (63 行目を参照)。このため、次回のサイクルの繰り返し時に、閉じられたプリペアド文の使用を試みることになる可能性があります。