我的java程序中的资源泄漏



我试图在java中编写一个方法,在那里我从文件中获取一些信息,并查看该文件是否具有用户查找的信息。但是,对于我所展示的代码,eclipse在"return true"行中显示有资源泄漏,并且"br = new BufferedReader(fr);"从未关闭,尽管我在程序末尾使用了close()方法。显然我漏掉了什么。有人能帮我弄清楚发生了什么事吗?提前感谢!

import java.io.*;
class Help{
    String helpfile;
    Help(String fname){
        helpfile = fname;
    }
    boolean helpon(String what){
        FileReader fr;
        BufferedReader br;
        int ch;
        String topic, info;
        try{
            fr = new FileReader(helpfile);
            br = new BufferedReader(fr);
        }
        catch(FileNotFoundException e){
            System.out.println(e);
            return false;
        }
        try{
            do{
                ch = br.read();
                if(ch=='#'){
                    topic = br.readLine();
                    if(what.compareTo(topic) == 0){
                        do{
                            info = br.readLine();
                            if(info!=null)
                                System.out.println(info);
                        }while((info!= null) && (info.compareTo("")!= 0));
                        return true;
                    }
                }
            }while(ch!=-1);
        }
        catch(IOException e){
            System.out.println(e);
            return false;
        }
        try{
            br.close();
        }
        catch(IOException e){
            System.out.println(e);
        }
        return false;
    }
}

问题是您在程序有机会关闭资源之前返回。有两种方法可以解决这个问题:

  1. 在关闭资源后放置返回值(可能通过将返回结果放在布尔值中)。
  2. 修改你的代码,把close语句放在finally语句块中,这样任何return语句都将执行该代码。

第2条通常是更容易接受的做法,因为如果将来添加更多的东西,仍然可以保证关闭资源(除非发生灾难性事件)。

boolean helpon(String what){
    FileReader fr;
    BufferedReader br;
    int ch;
    String topic, info;
    try{
        fr = new FileReader(helpfile);
        br = new BufferedReader(fr);
        do{
            ch = br.read();
            if(ch=='#'){
                topic = br.readLine();
                if(what.compareTo(topic) == 0){
                    do{
                        info = br.readLine();
                        if(info!=null)
                            System.out.println(info);
                    }while((info!= null) && (info.compareTo("")!= 0));
                    return true;
                }
            }
        }while(ch!=-1);
    } catch(IOException e){
        System.out.println(e);
        return false;
    } catch(FileNotFoundException e){
        System.out.println(e);
        return false;
    } finally {
        try {
            if (br != null) {
                br.close();
            }
        } catch(IOException e){
            System.out.println(e);
            return false;
        }
    }
}

在整个方法中都有返回语句,但只有在末尾有一个br.close()。在代码流中有可能返回该方法,而br仍然打开。

您可能对使用try with resources感兴趣

try (
        FileReader fr = new FileReader(helpfile);
        BufferedReader br = new BufferedReader(fr)
    ) 
{
  //your code
}
catch (IOException e)
{
 //error
}

这样,close方法将自动在资源上为您调用。

应该把对close()的调用放在finally块中。在当前状态下,您的代码将永远不会到达最后的try/catch,因为您返回true或false。

try {
    fr = new FileReader(helpfile);
    br = new BufferedReader(fr);
    do {
        ch = br.read();
        if(ch=='#'){
            topic = br.readLine();
            if(what.compareTo(topic) == 0){
                do{
                    info = br.readLine();
                    if(info!=null)
                        System.out.println(info);
                }while((info!= null) && (info.compareTo("")!= 0));
                return true;
            }
        }
    }while(ch!=-1);
} catch (IOException e) {
    System.out.println(e);
    return false;
} catch (FileNotFoundException e) {
    System.out.println(e);
    return false;
} finally  {
    try {
        if (br != null) {
            br.close();
        }
    } catch (IOException e) {
        System.out.println(e);
    }
}

如果您使用的是Java 7,请使用try-with-resources功能:

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

相关内容

  • 没有找到相关文章

最新更新