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' メソッドで閉じられるようになりました。このメソッドは、このストリームを開いたメソッドです。一般に、リソースを最初に割り当てたメソッドと同じメソッドでリソースを解放するのが好ましいコーディング手法です。