findViewById() может вызвать исключение NullPointerException.

У меня много таких звонков:

(ListView) getView().findViewById(R.id.main_list_view);
(TextView) getView().findViewById(R.id.items_no);
....

и AndroidStudio сообщает мне, что они могут создать NullPointerException:

Вызов метода getView().findViewById(R.id.main_list_view) может произвести на java.lang.NullPointerException меньше... (Ctrl+F1)

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

Переменные, параметры метода и возвращаемые значения, помеченные как @Nullable или @NotNull, обрабатываются как обнуляемые (или не нулевые, соответственно) и используются во время анализа для проверки контрактов на обнуляемость, например. сообщить о возможных NullPointerException ошибках.

Более сложные контракты можно определить с помощью аннотации @Contract, например:

@Contract("_, null -> null") — метод возвращает null, если его второй аргумент равен null @Contract("_, null -> null; _, !null -> !null") — метод возвращает null, если его второй аргумент равен null, и не null в противном случае

@Contract("true -> fail") — типичный метод assertFalse, который выдает исключение, если ему передается true

Проверка может быть настроена на использование пользовательских аннотаций @Nullable @NotNull (по умолчанию будут использоваться аннотации из annotations.jar)

К счастью, все работает, но можно ли улучшить этот код?


person Phate01    schedule 12.11.2015    source источник
comment
Вы хотите написать код, который никогда не сможет пройти через NPE?   -  person takendarkk    schedule 12.11.2015
comment
Вы используете шаблон ViewHolder?   -  person SKT    schedule 12.11.2015
comment
@takendarkk нет, но я хочу понять, почему ide говорит мне, что это может произойти   -  person Phate01    schedule 12.11.2015
comment
Потому что что произойдет, если вы дадите методу идентификатор, которого не существует? Он возвращает ноль. В этом нет ничего плохого.   -  person takendarkk    schedule 12.11.2015
comment
Я понимаю, но могу ли я улучшить этот код?   -  person Phate01    schedule 12.11.2015
comment
Не здесь. ЯВЛЯЕТСЯ. НИЧЕГО ТАКОГО. НЕПРАВИЛЬНЫЙ.   -  person takendarkk    schedule 12.11.2015


Ответы (3)


Это известная проблема в android.support.v7.app.AppCompatActivity, и она была исправлена ​​в v24.

https://code.google.com/p/android/issues/detail?id=203345

У вас не будет проблем с android.support.v4.app.FragmentActivity или android.app.Activity.

person Gayan Weerakutti    schedule 07.09.2016

Вы должны игнорировать проблему;

Как писал @DanDar3 -> getView() может возвращать значение null, и AndroidStudio подчеркивает это.

Но если вы действительно хотите сделать AndroidStudio счастливым - конечно, вы можете...:
Просто подтвердите, что представление не является нулевым:

View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);
person Witold Kaczurba    schedule 23.09.2017

Это связано с тем, что getView() может возвращать значение null и аннотируется как @Nullable, проверьте исходники и его JavaDoc — CTRL+Click на вызове getView() в вашем коде.

/**
 * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
 * if provided.
 * 
 * @return The fragment's root view, or null if it has no layout.
 */
@Nullable
public View getView() {
    return mView;
}

Вы можете самостоятельно обернуть свой код и проверить значение null, чтобы предупреждение исчезло, или иным образом поместить курсор в любое место внутри вызова findViewById(), подождать пару секунд, пока не появится лампочка (или нажать Alt + Enter), а затем выбрать один из предложенных решений.

person Dan Dar3    schedule 03.02.2016