UF.IN

UF (Use Freed) 問題は、リソースが解放された後にリソースを使用する試みがある場合に報告されます。UF.IN 警告は、入力ストリームが閉じられた後に入力ストリームの使用を試みていることを示します。

例 1

18     public boolean checkMeta(InputStream stream) {
19         byte[] b = new byte[8];
20         try {
21             final long l = stream.available();
22             if (l < 8) {
23                 return false;
24             }
25             stream.read(b);
26         } catch (IOException e) {
27             return false;
28         } finally {
29             try {
30                 stream.close();
31             } catch (IOException e) {
32                 // do nothing
33             }
34         }
35 
36         // Cast unsigned character constants prior to comparison
37         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
38                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
39                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
40                 b[6] == (byte) 'a' && b[7] == (byte) 't');
41     }
42 
43     public void printOut(final URL url, final PrintStream ps) throws IOException {
44         final InputStream stream = url.openStream();
45         if (checkMeta(stream)) {
46             try {
47                 ps.println("content:");
48                 byte[] b = new byte[1024];
49                 int i;
50                 while ((i = stream.read(b)) > 0) {
51                     ps.print(new String(b, 0, i));
52                 }
53                 ps.println();
54             } catch (IOException e) {
55                 e.printStackTrace();
56             }
57         }
58     }

UF.IN が 50 行目のスニペットについて報告されています。 30 行目で入力ストリーム 'stream' が閉じられた後、このストリームが使用されています。

例 2

18     public boolean checkMeta(InputStream stream) {
19         byte[] b = new byte[8];
20         try {
21             final long l = stream.available();
22             if (l < 8) {
23                 return false;
24             }
25             stream.read(b);
26         } catch (IOException e) {
27             return false;
28         }
29 
30         // Cast unsigned character constants prior to comparison
31         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
32                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
33                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
34                 b[6] == (byte) 'a' && b[7] == (byte) 't');
35     }
36 
37     public void printOut(final URL url, final PrintStream ps) throws IOException {
38         final InputStream stream = url.openStream();
39         try {
40             if (checkMeta(stream)) {
41                 try {
42                     ps.println("content:");
43                     byte[] b = new byte[1024];
44                     int i;
45                     while ((i = stream.read(b)) > 0) {
46                         ps.print(new String(b, 0, i));
47                     }
48                     ps.println();
49                 } catch (IOException e) {
50                     e.printStackTrace();
51                 }
52             }
53         } finally {
54             try {
55                 stream.close();
56             } catch (IOException e) {
57                 // do nothing
58             }
59         }
60     }

前節のスニペットが修正されています。メソッド 'checkMeta' ではストリームを閉じないようになっています。'printOut' メソッドで閉じられるようになりました。このメソッドは、このストリームを開いたメソッドです。一般に、リソースを最初に割り当てたメソッドと同じメソッドでリソースを解放するのが好ましいコーディング手法です。