Looking for java Keywords? Try Ask4Keywords

Java Language Pitfall - Возвращение null вместо исключения исключения


пример

Некоторые Java-программисты имеют общее отвращение к выбросам или распространению исключений. Это приводит к следующему коду:

public Reader getReader(String pathname) {
    try {
        return new BufferedReader(FileReader(pathname));
    } catch (IOException ex) {
        System.out.println("Open failed: " + ex.getMessage());
        return null;
    }

}

Так в чем проблема?

Проблема в том, что getReader возвращает значение null в качестве специального значения, чтобы указать, что Reader не может быть открыт. Теперь возвращаемое значение нужно протестировать, чтобы проверить, не является ли оно значением null до его использования. Если тест не учитывается, результатом будет исключение NullPointerException .

Здесь есть три проблемы:

  1. IOException было обнаружено слишком рано.
  2. Структура этого кода означает, что существует риск утечки ресурса.
  3. Затем был null потому что не было доступно «реальное» Reader .

На самом деле, предполагая, что исключение нужно было поймать раньше, было несколько альтернатив возврату null :

  1. Можно было бы реализовать класс NullReader ; например, когда операции API ведут себя так, как если бы читатель уже находился в позиции «конец файла».
  2. С Java 8 можно было бы объявить getReader как возвращающий Optional<Reader> .