Значення помилки Android Studio: Параметр, який не зазначається, замінює параметр @NonNull


104

Я пробую Android Studio. Створюючи новий проект і додаючи onSaveInstanceStateметод за замовчуванням до класу створення MyActivity, коли я намагаюся ввести код у Git, я отримую дивну помилку, яку я не розумію. Код такий:

Я отримую помилку така:

введіть тут опис зображення

Якщо я спробую змінити підпис методу на protected void onSaveInstanceState(@NotNull Bundle outState), IDE скаже мені, що він не може вирішити символ NotNull.

Що потрібно зробити, щоб позбутися попередження?

Відповіді:


124

Це примітка, але правильна назва NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(І також)

import android.support.annotation.NonNull;

Мета - дозволити компілятору попереджати про порушення певних припущень (наприклад, параметр методу, який завжди повинен мати значення, як у цьому конкретному випадку, хоча є й інші). З документації щодо підтримки приміток :

@NonNullАнотації можна використовувати , щоб вказати , що даний параметр не може бути порожнім.

Якщо локальна змінна, як відомо, є нульовою (наприклад, тому, що деякий попередній код перевіряв, чи був він нульовим), і ви передаєте її як параметр методу, де цей параметр позначений як @NonNull, IDE попередить, що у вас є потенційний збій.

Вони є інструментами для статичного аналізу. Поведінка виконання не змінюється взагалі.


У цьому випадку особливе попередження полягає в тому, що початковий метод, який ви переосмислюєте (in Activity), має @NonNullанотацію до outStateпараметра, але ви не включили його в метод переосмислення. Просто додавання його повинно виправити проблему, тобто

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}

5
Яка мета цього?
ІгорГанапольський

2
@IgorGanapolsky Вибачте, не згадував про це, тому що я припускав, що питання стосується лише NotNull/ NonNullрізниці. Відповідно скоригована відповідь.
matiash

2
Іншими словами, IMHO, ця анотація може видалити необхідну перевірку нуля всередині функції та мати швидший код.
Джон Панг

1
@JohnPang Ви могли , але оскільки обмеження, на яке посилається в анотації, не гарантується фактичного виконання, це може бути не дуже хорошою ідеєю.
матиш

імпортувати android.support.annotation.NonNull; шукаючи цю річ протягом 2 годин ... жоден не згадував, як імпортувати NonNull .. звідси і анотація
Shirish Herwade

15

Нещодавно в бібліотеці підтримки 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);
}

9

На додаток до інших відповідей, анотація @NonNull(і її противник @Nullable) анотує поле, параметр або метод повернення. IntelliJ і, таким чином, Android Studio можуть попередити вас про можливі NullPointerExceptions під час компіляції.

Приклад найкращий тут:

@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);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.