RLK.FIELD
RLK エラーは、システムリソースが割り当てられ、フィールドに保存された後、このリソースを解放するメソッドが呼び出されていないことを示します。RLK.FIELD エラーと他の RLK エラーの相違点は、RLK.FIELD では、作成されたリソースがフィールドに保存された後 (割り当てられたリソースを即座に閉じないことは許容可能)、これらのリソースを閉じるメソッドがないことを報告する点です。他の RLK エラーは、ローカル変数 (フィールドではない) に対して報告されます。リソースがフィールドに保存されていない場合、そのリソースは使用後に閉じる必要があります。RLK.FIELD は、private フィールドに対してのみ報告されます。
プレフィックス RLK.* を持つチェッカーは、リソースリークチェッカーです。すべてのナレッジベースチェッカーは、同じパラメータータイプ (ソースおよびシンク) を使用します。ソースは、リソースを割り当てるメソッドです。 たとえば、新しい FileInputStream() などです。シンクメソッドは、close などのリソースを破棄します。
RLK.* エラーは、ストリーム、SQL 接続、SWT リソースなど、さまざまなリソースに対して報告される場合があります。
脆弱性とリスク
ストリーム、接続、グラフィックオブジェクトなどのリソースは、明示的に閉じられる必要があります。閉じる操作により、トランザクションをアンブロックすることや、ファイルシステム内のファイルの変更をフラッシュすることができます。リソースは、最終的にはガーベッジコレクタにより閉じられますが、ガーベッジコレクションが開始される前にリソースの枯渇が発生する可能性があります。リソースの性質によっては、別のリソース割り当ての失敗時に、さまざまな例外がスローされます。次のような例外があります:java.io.FileNotFoundException:開かれたファイルが多すぎるか、データベース接続が多すぎます。
軽減と防止
重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。
例 1
class Logger {
private final PrintStream stream;
public Logger(String fileName)
throws FileNotFoundException {
if (fileName == null) stream = System.err;
else stream = new PrintStream(new FileOutputStream(
fileName));
}
public void warning(String str) {
System.out.print("Warning: " + str + ".\n");
}
}
RLK.FIELD が 14 行目のフィールド宣言に対して報告されています。フィールド 'stream' に保存されたシステムリソース 'java.io.PrintStream' がリークする可能性があります。リソースがいずれのクラスメソッドによっても閉じられていません。