[在此方法中,当我在return
块内的两个try
值中都被资源泄漏警告所困扰时,我在Eclipse中正常工作:
@Override
public boolean isValid(File file) throws IOException
{
BufferedReader reader = null;
try
{
reader = new BufferedReader(new FileReader(file));
String line;
while((line = reader.readLine()) != null)
{
line = line.trim();
if(line.isEmpty())
continue;
if(line.startsWith("#") == false)
return false;
if(line.startsWith("#MLProperties"))
return true;
}
}
finally
{
try{reader.close();}catch(Exception e){}
}
return false;
}
我不知道它会导致资源泄漏,因为我在reader
范围之外声明了try
变量,在try
块内添加了资源,并使用[其他finally
会忽略异常,如果try...catch
由于某些原因是NullPointerException
,则忽略reader
...
[据我所知,null
块总是在离开finally
结构时执行,因此在try...catch
块内部返回值仍将在退出方法之前执行try
块...
这很容易证明:
finally
结果为:
public static String test()
{
String x = "a";
try
{
x = "b";
System.out.println("try block");
return x;
}
finally
{
System.out.println("finally block");
}
}
public static void main(String[] args)
{
System.out.println("calling test()");
String ret = test();
System.out.println("test() returned "+ret);
}
知道了所有这些,为什么我要在calling test()
try block
finally block
test() returned b
块中关闭它,为什么eclipse告诉我Resource leak: 'reader' is not closed at this location
?>
我只想补充说,finally
他是对的,如果this answer引发异常,则new BufferedReader
的实例将在被垃圾收集器销毁后打开,因为它不会分配给任何变量,并且FileReader
]块不会关闭它,因为finally
将是reader
。
这是我修复此可能泄漏的方法:
null
[我在Eclipse中正常工作,但是在此方法的try块中的两个返回值中都遇到资源泄漏警告,使我感到困惑:@Override public boolean isValid(File file)throws ...
close()