Значение ошибки 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);
}