EN JP CN

UF.IMAGEIO

UF.IMAGEIO

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

例 1

17     public boolean canDecodeInput(ImageInputStream stream) {
18         byte[] b = new byte[8];
19         try {
20             final long l = stream.length();
21             if (l > 655335) {
22                 return false;
23             }
24             stream.mark();
25             stream.readFully(b);
26             stream.reset();
27         } catch (IOException e) {
28             return false;
29         } finally {
30             try {
31                 stream.close();
32             } catch (IOException e) {
33                 // do nothing
34             }
35         }
36 
37         // Cast unsigned character constants prior to comparison
38         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
39                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
40                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
41                 b[6] == (byte) 'a' && b[7] == (byte) 't');
42     }
43 
44     public void decode(Object data) throws IOException {
45         final ImageInputStream stream = ImageIO.createImageInputStream(data);
46         if (canDecodeInput(stream)) {
47             try {
48                 final int[] colors = new int[(int) stream.length()];
49                 for (int i = 0; i < colors.length; i++) {
50                     colors[i] = stream.readInt();
51                 }
52             } catch (IOException e) {
53                 e.printStackTrace();
54             }
55         }
56 
57     }

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

例 2

17     public boolean canDecodeInput(ImageInputStream stream) {
18         byte[] b = new byte[8];
19         try {
20             final long l = stream.length();
21             if (l > 655335) {
22                 return false;
23             }
24             stream.mark();
25             stream.readFully(b);
26             stream.reset();
27         } catch (IOException e) {
28             return false;
29         }
30 
31         // Cast unsigned character constants prior to comparison
32         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
33                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
34                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
35                 b[6] == (byte) 'a' && b[7] == (byte) 't');
36     }
37 
38     public void decode(Object data) throws IOException {
39         final ImageInputStream stream = ImageIO.createImageInputStream(data);
40         try {
41             if (canDecodeInput(stream)) {
42                 try {
43                     final int[] colors = new int[(int) stream.length()];
44                     for (int i = 0; i < colors.length; i++) {
45                         colors[i] = stream.readInt();
46                     }
47                 } catch (IOException e) {
48                     e.printStackTrace();
49                 }
50             }
51         } finally {
52             stream.close();
53         }
54     }

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