Bedeutung des Android Studio-Fehlers: Nicht kommentierter Parameter überschreibt den @ NonNull-Parameter

104

Ich probiere Android Studio aus. Wenn onSaveInstanceStateich beim Erstellen eines neuen Projekts und Hinzufügen einer Standardmethode zur Klasse "Create MyActivity" versuche, den Code an Git zu übergeben, wird ein seltsamer Fehler angezeigt , den ich nicht verstehe. Der Code lautet:

Der Fehler, den ich bekomme, ist folgender:

Geben Sie hier die Bildbeschreibung ein

Wenn ich versuche, die Methodensignatur in zu ändern protected void onSaveInstanceState(@NotNull Bundle outState), teilt mir die IDE mit, dass das Symbol nicht aufgelöst werden kann NotNull.

Was muss ich tun, um die Warnung loszuwerden?

Monomo
quelle

Antworten:

124

Es ist eine Anmerkung, aber der richtige Name lautet NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(Und auch)

import android.support.annotation.NonNull;

Der Zweck besteht darin, dem Compiler zu ermöglichen, zu warnen, wenn bestimmte Annahmen verletzt werden (z. B. ein Parameter einer Methode, die wie in diesem speziellen Fall immer einen Wert haben sollte, obwohl es andere gibt). Aus der Support Annotations- Dokumentation:

Die @NonNullAnmerkung kann verwendet werden, um anzuzeigen, dass ein bestimmter Parameter nicht null sein darf.

Wenn bekannt ist, dass eine lokale Variable null ist (z. B. weil ein früherer Code überprüft hat, ob sie null ist) und Sie dies als Parameter an eine Methode übergeben, bei der dieser Parameter als @NonNull markiert ist, werden Sie von der IDE gewarnt ein möglicher Absturz.

Sie sind Werkzeuge für die statische Analyse. Das Laufzeitverhalten wird überhaupt nicht verändert.


In diesem Fall besteht die besondere Warnung darin, dass die ursprüngliche Methode, die Sie überschreiben (in Activity), eine @NonNullAnmerkung zum outStateParameter enthält, diese jedoch nicht in die überschreibende Methode aufgenommen hat. Nur das Hinzufügen sollte das Problem beheben, dh

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
Matiash
quelle
5
Was ist der Zweck davon?
IgorGanapolsky
2
@IgorGanapolsky Sorry, hatte das nicht erwähnt, weil ich angenommen habe, dass die Frage nur über den NotNull/ NonNullUnterschied war. Antwort entsprechend angepasst.
Matiash
2
Mit anderen Worten, IMHO, diese Annotation kann die notwendige Nullprüfung innerhalb einer Funktion beseitigen und einen schnelleren Code haben.
John Pang
1
@ JohnPang Sie könnten , aber da die durch die Anmerkung implizierte Einschränkung nicht garantiert tatsächlich durchgesetzt wird, ist dies möglicherweise keine gute Idee.
Matiash
import android.support.annotation.NonNull; auf der Suche nach diesem Ding für 2 Stunden ... nicht einer erwähnte, wie man NonNull importiert .. daher upvote
Shirish Herwade
15

Eine Reihe von nützlichen der Android-Supportbibliothek wurden kürzlich Support-Anmerkungen hinzugefügt. Ihre Hauptaufgabe besteht darin, die Eigenschaften verschiedener Methoden und Parameter mit Anmerkungen zu versehen, um Fehler zu erkennen. Wenn Sie beispielsweise einen nullWert an einen Parameter übergeben, der mit der NotNullAnmerkung gekennzeichnet ist, wird eine Warnung angezeigt.

Die Anmerkungen können mit Gradle zu Ihrem Projekt hinzugefügt werden, indem die folgende Abhängigkeit hinzugefügt wird:

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

Sie erhalten die Warnung, weil der BundleParameter mit der @NotNullAnnotation markiert ist und durch Überschreiben der Methode die Annotation ausgeblendet wird. Das Richtige ist, die Annotation auch zum Parameter der Überschreibungsmethode hinzuzufügen.

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

Zusätzlich zu den anderen Antworten kommentiert die Annotation @NonNull(und ihr Gegner @Nullable) einen Feld-, Parameter- oder Methodenrückgabetyp. IntelliJ und damit Android Studio können Sie für möglich warnenNullPointerException beim Kompilieren Problemen .

Ein Beispiel ist hier am besten:

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

Diese Anmerkungen ändern nicht das Laufzeitverhalten (obwohl ich damit experimentiert habe), sondern dienen als Werkzeug zur Verhinderung von Fehlern.

Beachten Sie, dass die Nachricht, die Sie erhalten haben, kein Fehler war, sondern nur eine Warnung, die Sie ignorieren können, wenn Sie dies wünschen. Die Alternative besteht darin, den Parameter auch selbst zu kommentieren, wie Android Studio vorschlägt:

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