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)

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

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

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

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

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

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

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

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

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

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

Но если вы действительно хотите сделать AndroidStudio счастливым - обязательно...
Просто утверждение вида не равно нулю

View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);

Это причина getView() может возвращать ноль и помечается как @Nullable, проверьте источники и его JavaDoc - CTRL+ Нажмите на вызов 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), а затем выбрать один из них. из предложенных решений.

Другие вопросы по тегам