Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Эти istream
возвращенный getline()
имеет его метод оператора void*()
, неявно названный, который возвращается, столкнулся ли поток с ошибкой. Как таковой это осуществляет больше проверок, чем вызов к eof()
.
Обновлено:
Я ошибочно указал на документацию basic_istream для метода оператора bool () в классе basic_istream :: sentry, но, как и было указал, что это на самом деле не то, что происходит. Я проголосовал за правильные ответы Чарльза и Люка. На самом деле вызывается оператор void * (). Подробнее об этом в C ++ FAQ .
Charles действительно давал корректный ответ .
то, Что называют, действительно std::basic_ios::operator void*()
, а не sentry::operator bool()
, который согласовывается с тем, что std::getline()
возвраты std::basic_istream
(таким образом, std::basic_ios
), и не часовой.
Для не верующих, см.:
Иначе, как другие уже сказали, предпочитают вторую форму, которая является канонической. Используйте не fail()
, если действительно Вы хотите подробный код - я никогда не помню, может ли xxx.good()
использоваться вместо !xxx.fail()
Я бы придерживался первой формы. Хотя вторая форма может работать, она вряд ли является явной. Ваш оригинальный код четко описывает, что делается и как он должен себя вести.