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