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