ANDROID.RLK.SQLOBJ

如果资源经过分配,但使用后未得到妥当处置,将报告 RLK(资源泄漏)问题。ANDROID.RLK.SQLOBJ 警告表明,SQLite API 对象(而不是 SQL 连接)在退出时未关闭。

漏洞与风险

流、连接以及图形对象之类的资源必须明确关闭。关闭操作可以取消对事务的拦截,或将文件更改刷新到文件系统中。虽然资源最终会被垃圾回收器关闭,但可能在启动垃圾回收之前就已经耗尽资源。根据资源的不同性质,如果对分配其他资源的尝试失败,将引发各种不同的异常,例如 java.io.FileNotFoundException:打开的文件过多,或数据库连接过多。

缓解与预防

明确关闭所有具有关闭方法的资源,即使您认为不重要的资源亦应如此。这样将避免未来更改代码时出现这类错误。

示例 1

复制
     protected void onCreate(Bundle bundle) {
         super.onCreate(bundle);
         database = openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
 
         if (bundle != null) {
             final String[] queryClauseArray = bundle.getStringArray(KEY_QUERY);
             if (queryClauseArray != null) {
                 for (final String queryClause : queryClauseArray) {
                     final Cursor query = database.query(DATABASE_TABLE,
                                                         new String[]{KEY_FILE, KEY_DATE, KEY_COMMENT},
                                                         null,
                                                         null,
                                                         null,
                                                         null,
                                                         queryClause);
                     files.add(query.getString(0));
                     dates.add(query.getString(1));
                     comments.add(query.getString(2));
 
                 }
             }
         }
     }

针对第 49 行的代码段报告 ANDROID.RLK.SQLOBJ:query 数据库指针在退出时未关闭。

相关检查器

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。