Правильная обработка исключений при закрытии операций чтения/записи файлов


Что я хочу, так это уменьшить исключения, которые будут создаваться из метода.
Как вы можете видеть, у меня есть внутренний try catch во внешнем блоке catch, чтобы избежать исключения.
Это нормальный способ сделать это или есть лучшие (более элегантные) способы?
Или этот подход полностью ложен, и я должен просто выбросить исключение?

public static String readText(String filename) {        
    String text = "";
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader(filename));
        String line = null;
        while( (line = br.readLine()) != null ){
            text += line;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if(br != null)
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    return text;
}
3 2

3 ответа:

Лично я предпочел бы более современный подход либо с Files.readAllLines();, либо с Files.lines();.

Тогда все, что вам нужно обработать, - это исключение IOException, и ресурсы будут очищены для вас автоматически.

Есть несколько способов быть более кратким в том, что вы хотите сделать:

  1. Используйте функцию Java 7 для перехвата нескольких исключений в одном catch:

    try {...} catch(FileNotFoundException | IOException e) {...} 
    
  2. Используйте функцию Java 7 под названием try-with-resources, чтобы вы могли ommit окончательно:

    try (BufferedReader br =
        new BufferedReader(new FileReader(filename))) {
    }
    

В отношении выбрасывания исключений или нет-это выбор дизайна:

  • Хочу ли я сигнализировать об ошибках на верхний уровень?
  • Могу ли я справиться с ошибкой на верхнем уровне?

Если вы используете Java 7 или более позднюю версию, вы можете использовать try with resource.

try (BufferedReader br =
               new BufferedReader(new FileReader(path))) {
    String line = null;
    while( (line = br.readLine()) != null ){
        text += line;
    }
}