Search code examples
javaexceptiontry-catchioexceptionbufferedreader

How do I close a file after catching an IOException in java?


All,

I am trying to ensure that a file I have open with BufferedReader is closed when I catch an IOException, but it appears as if my BufferedReader object is out of scope in the catch block.

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 complains that it "cannot find symbol fileIn" in the catch block, but I want to ensure that in the case of an IOException that the Reader gets closed. How can I do that without the ugliness of a second try/catch construct around the first?

Any tips or pointers as to best practise in this situation is appreciated,


Solution

  •  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;
    

    A few things about the above code:

    • close should be in a finally, otherwise it won't get closed when the code completes normally, or if some other exception is thrown besides IOException.
    • Typically you have a static utility method to close a resource like that so that it checks for null and catches any exceptions (which you never want to do anything about other than log in this context).
    • The return belongs after the try so that both the main-line code and the exception catching have a return method without redundancy.
    • If you put the return inside the finally, it would generate a compiler warning.