这是内存泄漏还是误报?

2022-09-01 00:30:24

这是我的代码:

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();
    }
}

我收到一个警告,上面写着(我正在编译jdk1.7.0_05)。new Scanner(a)

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

是我做错了什么,还是这只是一个错误的警告?


答案 1

如果像这样拆分代码,警告会消失吗?

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

答案 2

是的,您的代码有潜在的(但不是真正的)内存泄漏。将 返回值赋给局部变量 ,但构造函数结果被丢弃。这就是您收到警告的原因。useDelimiter(a)scanner

实际上,返回值与从构造函数调用返回的对象完全相同,因此您的代码可以很好地关闭资源。但这是编译器/代码分析工具无法检测到的,因为它必须知道useDelimiters的实现。useDelimiter(a)

一个非常好的代码分析工具应该向你显示一个额外的警告,因为你正在关闭一个尚未在此方法中打开的资源(useDelimiter 的返回值)。如果您将这两条消息放在一起,则症状可能对您来说更清楚。


推荐