Signification de l'erreur Android Studio: le paramètre non annoté remplace le paramètre @NonNull

104

J'essaye Android Studio. Lors de la création d'un nouveau projet et de l'ajout d'une onSaveInstanceStateméthode par défaut à la classe create MyActivity, lorsque j'essaye de valider le code dans Git, j'obtiens une erreur étrange que je ne comprends pas. Le code est le suivant:

L'erreur que j'obtiens est la suivante:

entrez la description de l'image ici

Si j'essaye de changer la signature de méthode en protected void onSaveInstanceState(@NotNull Bundle outState), alors l'EDI me dit qu'il ne peut pas résoudre le symbole NotNull.

Que dois-je faire pour me débarrasser de l'avertissement?

Monomo
la source

Réponses:

124

C'est une annotation, mais le nom correct est NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(Et aussi)

import android.support.annotation.NonNull;

Le but est de permettre au compilateur d'avertir lorsque certaines hypothèses sont violées (comme un paramètre d'une méthode qui devrait toujours avoir une valeur, comme dans ce cas particulier, bien qu'il y en ait d'autres). Dans la documentation des annotations de support :

L' @NonNullannotation peut être utilisée pour indiquer qu'un paramètre donné ne peut pas être nul.

Si une variable locale est connue pour être nulle (par exemple parce qu'un code antérieur a vérifié si elle était nulle) et que vous la transmettez en tant que paramètre à une méthode où ce paramètre est marqué comme @NonNull, l'EDI vous avertira que vous avez un crash potentiel.

Ce sont des outils d'analyse statique. Le comportement d'exécution n'est pas du tout modifié.


Dans ce cas, l'avertissement particulier est que la méthode d'origine que vous remplacez (dans Activity) a une @NonNullannotation sur le outStateparamètre, mais vous ne l'avez pas incluse dans la méthode de remplacement. Le simple fait de l'ajouter devrait résoudre le problème, c'est à dire

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
matiash
la source
5
Quel en est le but?
IgorGanapolsky
2
@IgorGanapolsky Désolé, je n'avais pas mentionné cela parce que je supposais que la question portait uniquement sur la NotNull/ NonNulldifférence. Réponse ajustée en conséquence.
matiash
2
En d'autres termes, à mon humble avis, cette annotation peut supprimer le nécessaire de vérification de null à l'intérieur d'une fonction et avoir un code plus rapide.
John Pang
1
@JohnPang Vous pourriez , mais comme la restriction impliquée par l'annotation n'est pas garantie d'être réellement appliquée, ce n'est peut-être pas une bonne idée.
matiash
import android.support.annotation.NonNull; à la recherche de cette chose pendant 2 heures ... personne n'a mentionné comment importer NonNull .. d'où un vote favorable
Shirish Herwade
15

Un certain nombre d' annotations de support utiles ont été récemment ajoutées dans la bibliothèque de support Android. Leur rôle principal est d'annoter les propriétés de diverses méthodes et paramètres pour aider à détecter les bogues. Par exemple, si vous transmettez une nullvaleur à un paramètre marqué de l' NotNullannotation, vous recevrez un avertissement.

Les annotations peuvent être ajoutées à votre projet avec Gradle en ajoutant la dépendance suivante:

dependencies {
    compile 'com.android.support:support-annotations:20.0.0'
}

Vous recevez l'avertissement car le Bundleparamètre est marqué avec l' @NotNullannotation et en remplaçant la méthode, l'annotation est masquée. La bonne chose à faire est d'ajouter également l'annotation au paramètre de la méthode surchargée.

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
LukaCiko
la source
9

En plus des autres réponses, l' annotation @NonNull(et son adversaire @Nullable) annote un champ, un paramètre ou un type de retour de méthode. IntelliJ et donc Android Studio peuvent vous avertir d'éventuels NullPointerExceptions au moment de la compilation.

Un exemple est le meilleur ici:

@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
}

Ces annotations ne modifient pas le comportement d'exécution (bien que j'aie expérimenté cela), mais servent d'outil pour éviter les bogues.

Notez que le message que vous avez reçu n'était pas une erreur, mais juste un avertissement, que vous pouvez ignorer en toute sécurité si vous le souhaitez. L'alternative consiste à annoter vous-même le paramètre, comme le suggère Android Studio:

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