这是我的代码:
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.
我做错了什么,或者这只是一个错误的警告?
答案 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
确实如此),因此代码与此完全相同。