一千萬個為什麽

搜索

如何在java中捕獲IOException後關閉文件?

所有,

我正在嘗試確保在捕獲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被關閉。如果沒有圍繞第一個嘗試/捕獲構造的醜陋,我怎麽能這樣做呢?

關於這種情況下的最佳實踐的任何提示或指示表示贊賞,

最佳答案

 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應該在finally中,否則在代碼正常完成時不會關閉,或者除了IOException之外還拋出其他異常。
  • 通常,您有一個靜態實用工具方法來關閉這樣的資源,以便它檢查null並捕獲任何異常(除了在此上下文中登錄之外,您永遠不想做任何事情)。
  • 返回屬於try之後,因此主線代碼和異常捕獲都有一個沒有冗余的返回方法。
  • 如果你把return放在finally中,它會生成一個編譯器警告。

轉載註明原文: 如何在java中捕獲IOException後關閉文件?