EN JP CN

ANDROID.RLK.SQLOBJ

ANDROID.RLK.SQLOBJ

RLK (リソースリーク) 問題は、割り当てられたリソースが使用後に適切に破棄されなかった場合に報告されます。ANDROID.RLK.SQLOBJ 警告は、SQLite API オブジェクト (SQL 接続以外) が終了時に閉じられていないことを示します。

脆弱性とリスク

ストリーム、接続、グラフィックオブジェクトなどのリソースは、明示的に閉じられる必要があります。閉じる操作により、トランザクションをアンブロックすることや、ファイルシステム内のファイルの変更をフラッシュすることができます。リソースは、最終的にはガーベッジコレクタにより閉じられますが、ガーベッジコレクションが開始される前にリソースの枯渇が発生する可能性があります。リソースの性質によっては、別のリソース割り当ての失敗時に、さまざまな例外がスローされます。次のような例外があります:java.io.FileNotFoundException:開かれたファイルが多すぎるか、データベース接続が多すぎます。

軽減と防止

重要でないと考えられるリソースであっても、メソッドを持つリソースはすべて明示的に閉じてください。こうすることで、将来的なコード変更時にもこのようなエラーから安全が保たれます。

例 1

41     protected void onCreate(Bundle bundle) {
42         super.onCreate(bundle);
43         database = openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
44 
45         if (bundle != null) {
46             final String[] queryClauseArray = bundle.getStringArray(KEY_QUERY);
47             if (queryClauseArray != null) {
48                 for (final String queryClause : queryClauseArray) {
49                     final Cursor query = database.query(DATABASE_TABLE,
50                                                         new String[]{KEY_FILE, KEY_DATE, KEY_COMMENT},
51                                                         null,
52                                                         null,
53                                                         null,
54                                                         null,
55                                                         queryClause);
56                     files.add(query.getString(0));
57                     dates.add(query.getString(1));
58                     comments.add(query.getString(2));
59 
60                 }
61             }
62         }
63     }

データベースカーソル 'query’ が終了時に閉じられないため、ANDROID.RLK.SQLOBJ が 49 行目のスニペットに対して報告されています。

関連チェッカー

拡張機能

このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。