使用try时资源泄漏…最终?

问题描述 投票:5回答:4

[在此方法中,当我在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 ...

java eclipse resources eclipse-juno java-6
4个回答
2
投票

4
投票

1
投票

1
投票
close()
© www.soinside.com 2019 - 2024. All rights reserved.