Значение ошибки Android Studio: не аннотированный параметр переопределяет параметр @NonNull
Я тестирую Android Studio. При создании нового проекта и добавлении метода onSaveInstanceState
по умолчанию для класса MyActivity, когда я пытаюсь передать код на Git, я получаю странную ошибку, которую я не понимаю. Код выглядит так:
![]()
Ошибка, которую я получаю, такова:
![enter image description here]()
Если я попытаюсь изменить подпись метода на protected void onSaveInstanceState(@NotNull Bundle outState)
, тогда IDE сообщает мне, что не может разрешить символ NotNull
.
Что мне нужно сделать, чтобы избавиться от предупреждения?
Ответы
Ответ 1
Это аннотация, но правильное имя NonNull
:
protected void onSaveInstanceState(@NonNull Bundle outState)
(И также)
import android.support.annotation.NonNull;
Цель состоит в том, чтобы позволить компилятору предупреждать, когда нарушаются определенные допущения (например, параметр метода, который всегда должен иметь значение, как в данном конкретном случае, хотя есть другие). В документации Поддержка аннотаций:
Аннотация @NonNull
может использоваться, чтобы указать, что данный параметр не может быть нулевым.
Если локальная переменная известна как null (например, поскольку некоторые более ранний код проверял, было ли оно нулевым), и вы передаете это как параметр к методу, где этот параметр отмечен как @NonNull, IDE предупредит вас, что у вас есть потенциальная авария.
Это инструменты для статического анализа. Поведение во время выполнения не изменяется вообще.
В этом случае особое предупреждение заключается в том, что исходный метод, который вы переопределяете (в Activity
), имеет аннотацию @NonNull
в параметре outState
, но вы не включили его в метод переопределения. Просто добавьте его, чтобы исправить проблему, т.е.
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}
Ответ 2
Недавно в библиотеке поддержки Android было добавлено несколько полезных аннотаций поддержки. Их основная роль - аннотировать свойства различных методов и параметров, чтобы помочь поймать ошибки. Например, если вы передадите значение null
в параметр, помеченный аннотацией NotNull
, вы получите предупреждение.
Аннотации могут быть добавлены в ваш проект с помощью Gradle, добавив следующую зависимость:
dependencies {
compile 'com.android.support:support-annotations:20.0.0'
}
Вы получаете предупреждение, потому что параметр Bundle
помечен аннотацией @NotNull
и переопределяет метод, с которым скрывается аннотация. Правильная вещь - добавить аннотацию к параметру переопределенного метода.
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}
Ответ 3
В дополнение к другим ответам аннотация @NonNull
(и ее противник, @Nullable
) аннотирует тип возвращаемого поля, параметра или метода. IntelliJ и, таким образом, Android Studio может предупредить вас о возможном NullPointerException
во время компиляции.
Пример лучше всего здесь:
@NonNull private String myString = "Hello";
@Nullable private String myOtherString = null;
@NonNull
public Object doStuff() {
System.out.println(myString.length); // No warning
System.out.println(doSomething(myString).length); // Warning, the result might be null.
doSomething(myOtherString); // Warning, myOtherString might be null.
return myOtherString; // Warning, myOtherString might be null.
}
@Nullable
private String doSomething(@NonNull String a) {
return a.length > 1 ? null : a; // No warning
}
Эти аннотации не изменяют поведение во время выполнения (хотя я экспериментировал с этим), но служат инструментом для предотвращения ошибок.
Обратите внимание, что полученное сообщение не было ошибкой, а просто предупреждением, которое можно игнорировать, если вы решите. Альтернативой является также аннотировать параметр самостоятельно, как предлагает Android Studio:
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
}