RLK.FIELD

RLK 错误表明系统资源被分配并存储在字段中,但却不存在对可释放该资源的方法的调用。RLK.FIELD 和其他 RLK 错误之间的区别在于,RLK.FIELD 报告的是创建并存储在字段中的资源(可以接受不立即关闭已分配的资源),而且没有关闭这些资源的方法。针对局部变量(而非字段)报告了其他 RLK 错误。如果资源未被存储在字段中,则应在使用后关闭它。RLK.FIELD 仅针对私有字段进行报告。

前缀为 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");
         }
     }

针对第 14 行的字段声明报告 RLK.FIELD:存储在字段 'stream' 中的系统资源 'java.io.PrintStream' 可能泄露。未在任何类方法中关闭资源。

相关检查器