UF.IN

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

例 1

コピー
     public boolean checkMeta(InputStream stream) {
         byte[] b = new byte[8];
         try {
             final long l = stream.available();
             if (l < 8) {
                 return false;
             }
             stream.read(b);
         } 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 printOut(final URL url, final PrintStream ps) throws IOException {
         final InputStream stream = url.openStream();
         if (checkMeta(stream)) {
             try {
                 ps.println("content:");
                 byte[] b = new byte[1024];
                 int i;
                 while ((i = stream.read(b)) > 0) {
                     ps.print(new String(b, 0, i));
                 }
                 ps.println();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }

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

例 2

コピー
     public boolean checkMeta(InputStream stream) {
         byte[] b = new byte[8];
         try {
             final long l = stream.available();
             if (l < 8) {
                 return false;
             }
             stream.read(b);
         } 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 printOut(final URL url, final PrintStream ps) throws IOException {
         final InputStream stream = url.openStream();
         try {
             if (checkMeta(stream)) {
                 try {
                     ps.println("content:");
                     byte[] b = new byte[1024];
                     int i;
                     while ((i = stream.read(b)) > 0) {
                         ps.print(new String(b, 0, i));
                     }
                     ps.println();
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
             }
         } finally {
             try {
                 stream.close();
             } catch (IOException e) {
                 // do nothing
             }
         }
     }

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