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), а затем выбрать один из них. из предложенных решений.