这是我的代码:
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.
我是不是做错了什么,或者这只是一个虚假的警告?
如果拆分这样的代码,将警告消失?
Scanner scanner = new Scanner(a);
scanner.useDelimiter(",");
scanner.close();
是的,你的代码有一个潜在的(但不是真正的)内存泄漏。 您指定的返回值useDelimiter(a)
局部变量scanner
,但构造的结果被丢弃。 这就是为什么你会得到警告。
在实践中,返回值useDelimiter(a)
是完全相同的对象作为一个从构造函数调用返回,所以你的代码将关闭资源就好了。 不过这是后话编译/代码分析工具无法检测,因为它必须知道的是,useDelimiters实施。
而一个真正好的代码分析工具应该表现出你额外的警告,因为你正在关闭已经在此方法(useDelimiter的返回值)被打开的资源。 如果你有这些2级的消息一起,症状可能更清楚你。
你有没有尝试:
Scanner scanner = new Scanner(new BufferedReader(new FileReader("a"))).useDelimiter(",");
如果不工作,你必须添加a.close();
是什么让你这样的警告? 据推测,它警告因为分配/关闭未在try / finally块,这通常是一个坏主意(在这种特定情况下,虽然没有问题的完成,因为可以抛出一个错误的唯一的事情是新的FileReader,如果它不引发资源已实际分配的 - 但可以用一个方法调用改变。)
关闭扫描仪关闭底层流(以实现自身准确的东西Closeable
(是BufferedReader
做),这样的代码是天晴从。