2012-01-24 3 views
7
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 cannot be resolved

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

ответ

17

Переменная 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()

+0

Если я это сделаю, тогда он говорит, что мне нужно добавить еще один блок Try, закрывая файл. Я прочитал предыдущий пост, где было сказано, что с этим ничего нельзя поделать. Итак, это лучший способ? – noMAD

+0

Да, это раздражает. Для этого часто используется метод утилиты, называемый «closeQuietly» (или аналогичный). Он ловит и игнорирует Исключение. – user949300

+0

См. Отредактированный ответ для вложенных 'try/catch' - также общий шаблон – Bohemian

5

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

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

    String line = null; 

    } 

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

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

+2

Да, но только в Java 7. Java 6 и ранее этого не имеют. – user949300

+0

да, это правда. – Kushan

+0

В случае, если кто-нибудь задается вопросом, почему это, найдите «попробуйте с ресурсами» – axxis

0

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

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(); 
} 

таким образом, фр будет существовать в наконец-х блочной области.