web-dev-qa-db-fra.com

Signification de Android Erreur studio: le paramètre non annoté remplace le paramètre @NonNull.

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

L'erreur que je reçois est la suivante:

enter image description here

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

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

96
Monomo

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). À partir de la documentation Annotations d'assistance :

Le @NonNull L'annotation peut être utilisée pour indiquer qu'un paramètre donné ne peut pas être null.

Si une variable locale est connue comme étant nulle (par exemple parce qu'un code précédent 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, le IDE vous avertira que vous avez un crash potentiel.

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


Dans ce cas, l’avertissement est que la méthode originale que vous substituez (dans Activity) a un @NonNull annotation sur le paramètre outState, mais vous ne l'avez pas incluse dans la méthode de substitution. 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);
}
115
matiash

Un certain nombre d’annotations de support utiles ont récemment été ajoutées à la bibliothèque de support Android). Leur rôle principal consiste à annoter les propriétés de diverses méthodes et paramètres pour vous aider à détecter les bogues, par exemple, si vous transmettez la valeur null à un paramètre marqué avec l'annotation NotNull, 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 obtenez cet avertissement car le paramètre Bundle est marqué du symbole @NotNull annotation et en remplaçant la méthode, l'annotation est masquée. La bonne chose à faire est d’ajouter l’annotation au paramètre de la méthode surchargée.

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

En plus des autres réponses, le @NonNull (et son adversaire, @Nullable) annotation annote un type de retour de champ, paramètre ou méthode. IntelliJ et donc Android Studio peut vous avertir de la possibilité de 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 à l'exécution (bien que j'ai expérimenté avec cela), mais servent d'outil pour prévenir les bogues.

Notez que le message que vous avez reçu n'était pas une erreur, mais simplement un avertissement qu'il est prudent d'ignorer si vous le souhaitez. L’autre solution consiste à annoter vous-même le paramètre, comme suit: Android Studio suggère:

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