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?

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);
}

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);
}

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);
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.