这是内存泄漏还是误报?

时间:2012-07-13 02:27:54

标签: java eclipse memory-leaks warnings

这是我的代码:

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.

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

4 个答案:

答案 0 :(得分:57)

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

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

答案 1 :(得分:11)

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

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

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

答案 2 :(得分:1)

你有没有尝试过:

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

如果不起作用,您必须添加a.close();

答案 3 :(得分:0)

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

关闭扫描程序会关闭基础流(确切地说是实现自身的任何事情Closeable(是BufferedReader确实如此),因此代码与此完全相同。