Закрыть файл в блоке finally не работает - PullRequest
10 голосов
/ 24 января 2012
try {
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException fnf) {
    fnf.printStackTrace();
} finally {
    fr.close();
}

fr.close() показывает ошибку:

fr не может быть решена

Я читал, что закрытие файла в блоке finally - это хорошая практика.
Что это я делаю не так?

Ответы [ 3 ]

22 голосов
/ 24 января 2012

Переменная fr имеет область видимости только в блоке try. Это выходит за рамки в блоке finally. Вам нужно объявить его до блока try:

FileReader fr = null;
try {
    fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (fr != null) {
        try {
            fr.close();
        } catch (IOException e) {
            // This is unrecoverable. Just report it and move on
            e.printStackTrace();
        }
    }
}

Это довольно распространенный шаблон кода, поэтому хорошо помнить его для будущих подобных ситуаций.

Подумайте над тем, чтобы выбросить IOException из этого метода - печать следов дорожек не очень полезна для вызывающих абонентов, и , вам не понадобится вложенная попытка поймать вокруг fr.close()

7 голосов
/ 24 января 2012

Теперь, наконец, блок не нужен,

try (FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);){

    String line = null;

    }

} catch(FileNotFoundException fnf) {
    fnf.printStackTrace();
} 

теперь автоматически закройте ваши читатели

0 голосов
/ 24 января 2012

У вас проблемы с вашими областями. Если вы действительно хотите использовать этот синтаксис, вы должны исправить это так:

FileReader fr = null;
try {
    fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException fnf) {
    fnf.printStackTrace();
} finally {
    if( fr != null)
       fr.close();
}

таким образом, fr будет существовать в области блока finally.

...