这是内存泄漏或假阳性?(Is this a memory leak or a false posit

2019-06-26 05:49发布

这是我的代码:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Scanner;

public class temp {
    public static void main(String[] args) throws FileNotFoundException {
        BufferedReader a = new BufferedReader(new FileReader("a"));
        Scanner scanner = new Scanner(a).useDelimiter(",");
        scanner.close();
    }
}

我得到一个警告, new Scanner(a) ,说(我用jdk1.7.0_05编译。):

Resource leak: '<unassigned Closeable value>' is never closed.

我是不是做错了什么,或者这只是一个虚假的警告?

Answer 1:

如果拆分这样的代码,将警告消失?

  Scanner scanner = new Scanner(a);
  scanner.useDelimiter(",");
  scanner.close();


Answer 2:

是的,你的代码有一个潜在的(但不是真正的)内存泄漏。 您指定的返回值useDelimiter(a)局部变量scanner ,但构造的结果被丢弃。 这就是为什么你会得到警告。

在实践中,返回值useDelimiter(a)是完全相同的对象作为一个从构造函数调用返回,所以你的代码将关闭资源就好了。 不过这是后话编译/代码分析工具无法检测,因为它必须知道的是,useDelimiters实施。

而一个真正好的代码分析工具应该表现出你额外的警告,因为你正在关闭已经在此方法(useDelimiter的返回值)被打开的资源。 如果你有这些2级的消息一起,症状可能更清楚你。



Answer 3:

你有没有尝试:

Scanner scanner = new Scanner(new BufferedReader(new FileReader("a"))).useDelimiter(",");

如果不工作,你必须添加a.close();



Answer 4:

是什么让你这样的警告? 据推测,它警告因为分配/关闭未在try / finally块,这通常是一个坏主意(在这种特定情况下,虽然没有问题的完成,因为可以抛出一个错误的唯一的事情是新的FileReader,如果它不引发资源已实际分配的 - 但可以用一个方法调用改变。)

关闭扫描仪关闭底层流(以实现自身准确的东西Closeable (是BufferedReader做),这样的代码是天晴从。



文章来源: Is this a memory leak or a false positive?