Я работаю через приложение для Android, которое я пишу, и пытаюсь привести свой код в соответствие с рекомендациями Linux Studio.getText() из EditText: возможно ли получить «нуль»?
Я следующий код, который выдает предупреждение (некоторый код опущен):
final EditText input = (EditText)view.findViewById(R.id.edit_text);
Button button = (Button)view.findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String value = input.getText().toString();
if (value == null || value.length() == 0) {
Android-студия дает мне предупреждение, что:
'значение == NULL' условие всегда ложь.
Когда я позволяю Android-студия "исправить" эту проблему для меня, она рекомендует:
упрощать 'значение == NULL' к ложному
код становится:
if (value.length() == 0) {
Я просмотрел исходный код Android (http://www.grepcode.com), и я смущен. В документации для EditText
говорится: «EditText - это тонкий шпон поверх TextView, который настраивается для редактирования». Затем метод getText()
определяется следующим образом:
@Override
public Editable getText() {
return (Editable) super.getText();
}
Когда я иду в getText()
для TextView
(в «супер»), я вижу это:
public CharSequence getText() {
return mText;
}
setText()
метод для TextView
появляется чтобы запретить значение null
, потому что это начало этого метода:
private void setText(CharSequence text, BufferType type, boolean notifyBefore, int oldlen) {
if (text == null) {
text = "";
}
Конструктор по умолчанию начинается этот путь, тоже:
public TextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mText = "";
Таким образом, казалось бы, что не существует никакого способа getText()
возвращать значение null
, но комментарии на this answer показывают, что это. Ответы на this question также показывают, что это возможно.
Я хотел бы практиковать оборонительное кодирование, поэтому я структурировал мой код так, как я с самого начала, но я не хочу, чтобы делать null
чек на то, что не может быть null
. Итак, какова наилучшая практика в этом случае?
вы будете проверять как value.equals ("") и ссылается на это также http://stackoverflow.com/a/3321548/4478125 –
Я думаю, что проверка на линт говорит вам кое-что немного иначе, чем то, что вы читаете Это. На самом деле это не имеет значения для if-statement, может ли 'EditText.getText()' возвращать значение null. Потому что, если он возвращает null, то '.toString()' вызовет исключение NullPointerException до того, как будет достигнут оператор if. Поэтому, если if-statement достигнут, значение не может быть null. Поэтому проверка 'value == null' не требуется. – Barend
@Barend Это имеет немного больше смысла. Я понял, что проверка ворса не может быть достаточно умна, чтобы анализировать все слои, которые я сделал. Итак, возникает вопрос, является ли моя строка 'String value = input.getText(). ToString();' уязвима для NPE. – mbm29414