Может ли EditText.getText () быть нулевым? - PullRequest
3 голосов
/ 18 апреля 2020

Я использую TextInputLayout с TextInputEditText и Android Lint всегда предупреждает меня, что вызов toString() на getText() может привести к NullPointerException.

Лично у меня никогда не было NPE никогда не делал этого, даже когда TextInputEditText был пуст.

Я помню, что читал, что возвращаемое значение может быть null только при создании представления или чего-то подобного где-то.

Безопасно ли на производстве просто игнорировать предупреждение Lint или я должен проверить на null на всякий случай?

Ответы [ 2 ]

2 голосов
/ 18 апреля 2020

Чтобы ответить на этот вопрос, мы можем взглянуть на исходный код.

TextView.getText(), метод суперкласса, является довольно простым : он возвращает mText.

mText помечен как nullable , но, просматривая код, ничто не устанавливает его в null, и конструктор проверяет его , чтобы убедиться, что это не null перед возвратом. Он помечен @UnsupportedAppUsage, что означает, что, по крайней мере, сторонний код может получить к нему доступ посредством отражения.

Для некоторых дополнительных подсказок, если это то, что может разумно произойти, мы можем посмотреть на другое использование в TextView, чтобы увидеть, является ли это допустимым состоянием. Такие методы, как length() и другие, вызывают метод на mText без проверки на ноль, поэтому, если он вернется к нулевому значению после возврата конструктора, вы увидите сбой.

Однако нам также нужно взглянуть на EditText, потому что EditText переопределяет getText(). Там есть комментарий, который дает нам подсказку, которая нам нужна:

        // This can only happen during construction.
        if (text == null) {

В противном случае метод возвращает результат super.getText() различными способами, поэтому применяется наш анализ выше: иначе он не может быть нулевым.

Еще одно место для проверки: TextInputEditText переопределить getText()? Это не так.

Итак, краткий ответ: нет, нет, если только у вас нет странного подкласса этого или вы вызываете его во время конструирования (что было бы возможно, только если вы сами подклассировали его) , Технически это не применяется, но на самом деле это не должно происходить со стандартными компонентами от Google, хотя Пункт CommonsWare ниже - это хорошая вещь, о которой следует помнить .

2 голосов
/ 18 апреля 2020

Редактируемый - это interface. Возможно, что используемые вами реализации interface не могут быть null, но даже если бы мы на самом деле знали, что в ваших сценариях использования безопасно не обрабатывать NPE, я бы посоветовал против этого. Для используемого интерфейса могут быть реализации, которые могут иметь значение NULL. Вы можете реализовать метод util для решения этой проблемы, если проблема заключается в том, что вы повторяете это снова и снова.

РЕДАКТИРОВАТЬ

Как указал Райан М в разделе комментариев и документация подтверждает, В Editable нет метода getText, однако это не меняет общих мыслей о разделении наших интересов.

...