UF.IMAGEIO

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

例 1

コピー
     public boolean canDecodeInput(ImageInputStream stream) {
         byte[] b = new byte[8];
         try {
             final long l = stream.length();
             if (l > 655335) {
                 return false;
             }
             stream.mark();
             stream.readFully(b);
             stream.reset();
         } catch (IOException e) {
             return false;
         } finally {
             try {
                 stream.close();
             } catch (IOException e) {
                 // do nothing
             }
         }
 
         // Cast unsigned character constants prior to comparison
         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
                 b[6] == (byte) 'a' && b[7] == (byte) 't');
     }
 
     public void decode(Object data) throws IOException {
         final ImageInputStream stream = ImageIO.createImageInputStream(data);
         if (canDecodeInput(stream)) {
             try {
                 final int[] colors = new int[(int) stream.length()];
                 for (int i = 0; i < colors.length; i++) {
                     colors[i] = stream.readInt();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
 
     }

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

例 2

コピー
     public boolean canDecodeInput(ImageInputStream stream) {
         byte[] b = new byte[8];
         try {
             final long l = stream.length();
             if (l > 655335) {
                 return false;
             }
             stream.mark();
             stream.readFully(b);
             stream.reset();
         } catch (IOException e) {
             return false;
         }
 
         // Cast unsigned character constants prior to comparison
         return (b[0] == (byte) 'm' && b[1] == (byte) 'y' &&
                 b[2] == (byte) 'f' && b[3] == (byte) 'o' &&
                 b[4] == (byte) 'r' && b[5] == (byte) 'm' &&
                 b[6] == (byte) 'a' && b[7] == (byte) 't');
     }
 
     public void decode(Object data) throws IOException {
         final ImageInputStream stream = ImageIO.createImageInputStream(data);
         try {
             if (canDecodeInput(stream)) {
                 try {
                     final int[] colors = new int[(int) stream.length()];
                     for (int i = 0; i < colors.length; i++) {
                         colors[i] = stream.readInt();
                     }
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         } finally {
             stream.close();
         }
     }

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