Jos*_*ior 5 java eclipse resources java-6 eclipse-juno
当我在此方法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;
}
Run Code Online (Sandbox Code Playgroud)
我不明白它会导致资源泄漏的原因,因为我是reader
在try
作用域之外声明变量,在try
块内添加资源,然后在另一个finally
块中将其关闭以使用另一个try...catch
忽略异常,而NullPointerException
if 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);
}
Run Code Online (Sandbox Code Playgroud)
结果是:
calling test()
try block
finally block
test() returned b
Run Code Online (Sandbox Code Playgroud)
知道了所有这些之后,为什么eclipse会告诉我Resource leak: 'reader' is not closed at this location
是否要在我的finally
区块中关闭它?
我只是在回答中补充说他是正确的,如果new BufferedReader
引发异常,则FileReader
垃圾回收器销毁后将打开的实例,因为不会将其分配给任何变量,而该finally
块不会将其关闭,因为reader
它将是null
。
这是我修复此可能泄漏的方法:
@Override
public boolean isValid(File file) throws IOException
{
FileReader fileReader = null;
BufferedReader reader = null;
try
{
fileReader = new FileReader(file);
reader = new BufferedReader(fileReader);
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){
try{fileReader.close();}catch(Exception ee){}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8014 次 |
最近记录: |