我试图在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;
}
}
问题是您在程序有机会关闭资源之前返回。有两种方法可以解决这个问题:
- 在关闭资源后放置返回值(可能通过将返回结果放在布尔值中)。
- 修改你的代码,把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