станд.:: getline () возвраты

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

25
задан Azeem 4 September 2018 в 07:11
поделиться

4 ответа

Эти istream возвращенный getline() имеет его метод оператора void*(), неявно названный, который возвращается, столкнулся ли поток с ошибкой. Как таковой это осуществляет больше проверок, чем вызов к eof().

27
ответ дан Azeem 28 November 2019 в 21:26
поделиться

Обновлено:

Я ошибочно указал на документацию basic_istream для метода оператора bool () в классе basic_istream :: sentry, но, как и было указал, что это на самом деле не то, что происходит. Я проголосовал за правильные ответы Чарльза и Люка. На самом деле вызывается оператор void * (). Подробнее об этом в C ++ FAQ .

8
ответ дан Todd Gamblin 28 November 2019 в 21:26
поделиться

Charles действительно давал корректный ответ .

то, Что называют, действительно std::basic_ios::operator void*(), а не sentry::operator bool(), который согласовывается с тем, что std::getline() возвраты std::basic_istream (таким образом, std::basic_ios), и не часовой.

Для не верующих, см.:

Иначе, как другие уже сказали, предпочитают вторую форму, которая является канонической. Используйте не fail(), если действительно Вы хотите подробный код - я никогда не помню, может ли xxx.good() использоваться вместо !xxx.fail()

5
ответ дан Community 28 November 2019 в 21:26
поделиться

Я бы придерживался первой формы. Хотя вторая форма может работать, она вряд ли является явной. Ваш оригинальный код четко описывает, что делается и как он должен себя вести.

-3
ответ дан e.James 28 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: