Bedeutung des Android Studio-Fehlers: Nicht kommentierter Parameter überschreibt @NonNull-Parameter
Lesezeit: 4 Minuten
Monomo
Ich probiere Android Studio aus. Beim Erstellen eines neuen Projekts und Hinzufügen einer Standarddatei onSaveInstanceState -Methode an die create MyActivity-Klasse an, wenn ich versuche, den Code an Git zu übergeben, erhalte ich einen seltsamen Fehler, den ich nicht verstehe. Der Code ist dieser:
Der Fehler, den ich bekomme, ist dieser:
Wenn ich versuche, die Methodensignatur zu ändern protected void onSaveInstanceState(@NotNull Bundle outState)dann sagt mir die IDE, dass sie das Symbol nicht auflösen kann NotNull.
Was muss ich tun, um die Warnung loszuwerden?
matiasch
Es ist eine Anmerkung, aber der richtige Name ist NonNull:
Der Zweck besteht darin, die Compiler um zu warnen, wenn bestimmte Annahmen verletzt werden (z. B. ein Parameter einer Methode, der immer einen Wert haben sollte, wie in diesem speziellen Fall, obwohl es andere gibt). Von dem Anmerkungen unterstützen Dokumentation:
Das @NonNull Annotation kann verwendet werden, um anzuzeigen, dass ein bestimmter Parameter nicht null sein kann.
Wenn bekannt ist, dass eine lokale Variable null ist (z. B. weil ein früherer Code überprüft hat, ob sie null war), und Sie dies als Parameter an eine Methode übergeben, in der dieser Parameter als @NonNull gekennzeichnet ist, wird die IDE Sie warnen, dass Sie dies getan haben 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) hat ein @NonNull Anmerkung auf der outState -Parameter, aber Sie haben ihn nicht in die überschreibende Methode eingeschlossen. Nur das Hinzufügen sollte das Problem beheben, dh
@IgorGanapolsky Entschuldigung, hatte das nicht erwähnt, weil ich annahm, dass es bei der Frage nur um die ging NotNull/NonNull Unterschied. Antwort entsprechend angepasst.
– Matiasch
19. November 2014 um 16:38 Uhr
Mit anderen Worten, meiner Meinung nach kann diese Anmerkung die Notwendigkeit der Nullprüfung innerhalb einer Funktion beseitigen und einen schnelleren Code haben.
– John Pang
27. März 2015 um 20:07 Uhr
@JohnPang Du könnteaber da die durch die Anmerkung implizierte Einschränkung nicht garantiert tatsächlich durchgesetzt wird, ist dies möglicherweise keine gute Idee.
– Matiasch
27. März 2015 um 20:16 Uhr
import android.support.annotation.NonNull; 2 Stunden lang nach diesem Ding gesucht … keiner hat erwähnt, wie man NonNull importiert … daher positiv
– Shirish Herwade
11. August 2016 um 10:18 Uhr
Lukas Ciko
Eine Reihe von nützlichen Anmerkungen unterstützen wurden kürzlich in der Android-Support-Bibliothek hinzugefügt. Ihre Hauptaufgabe besteht darin, Eigenschaften verschiedener Methoden und Parameter zu kommentieren, um Fehler zu finden. Zum Beispiel, wenn Sie bestehen null Wert auf einen Parameter, der mit gekennzeichnet ist NotNull Anmerkung erhalten Sie eine Warnung.
Die Anmerkungen können Ihrem Projekt mit Gradle hinzugefügt werden, indem Sie die folgende Abhängigkeit hinzufügen:
Sie erhalten die Warnung, weil die Bundle Parameter ist mit gekennzeichnet @NotNull Anmerkung und durch Überschreiben der Methode wird die Anmerkung ausgeblendet. Das Richtige ist, die Anmerkung auch zum Parameter der überschriebenen Methode hinzuzufügen.
Zusätzlich zu den anderen Antworten, die @NonNull (und sein Gegner, @Nullable) annotation kommentiert einen Feld-, Parameter- oder Methodenrückgabetyp. IntelliJ und damit Android Studio können Sie vor möglichen Fehlern warnen NullPointerExceptions zur Kompilierzeit.
Hier eignet sich am besten ein Beispiel:
@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 das Laufzeitverhalten nicht (obwohl ich es getan habe experimentiert mit diesem), sondern dienen als Werkzeug zur Vermeidung 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: