小编典典

在Java中捕获IOException后如何关闭文件?

java

所有,

我试图确保在捕获IOException时关闭我用BufferedReader打开的文件,但它看起来好像我的BufferedReader对象超出了catch块的范围。

public static ArrayList readFiletoArrayList(String fileName, ArrayList fileArrayList)
{
    fileArrayList.removeAll(fileArrayList);

    try {
        //open the file for reading
        BufferedReader fileIn = new BufferedReader(new FileReader(fileName));

        // add line by line to array list, until end of file is reached
        // when buffered reader returns null (todo). 
        while(true){
                fileArrayList.add(fileIn.readLine());
            }
    }catch(IOException e){
        fileArrayList.removeAll(fileArrayList);
        fileIn.close(); 
        return fileArrayList; //returned empty. Dealt with in calling code. 
    }
}

Netbeans抱怨说它在catch块中“找不到符号fileIn”,但是我想确保在发生IOException的情况下,Reader被关闭。在没有围绕第一个try
/ catch构造的丑陋的情况下,我该怎么做呢?

在这种情况下,有关最佳做法的任何提示或建议,


阅读 212

收藏
2020-11-16

共1个答案

小编典典

 BufferedReader fileIn = null;
 try {
       fileIn = new BufferedReader(new FileReader(filename));
       //etc.
 } catch(IOException e) {
      fileArrayList.removeall(fileArrayList);
 } finally {
     try {
       if (fileIn != null) fileIn.close();
     } catch (IOException io) {
        //log exception here
     }
 }
 return fileArrayList;

关于上述代码的几件事:

  • close应该在final中,否则在代码正常完成时,或者在IOException之外引发其他异常时,它不会关闭。
  • 通常,您有一个静态实用程序方法来关闭类似的资源,以便它检查null并捕获任何异常(除了在此上下文中登录外,您永远不想做任何其他事情)。
  • 返回属于尝试之后的内容,因此主代码和异常捕获都具有没有冗余的return方法。
  • 如果将返回值放在finally中,则会生成编译器警告。
2020-11-16