2014-07-14 6 views
65

Ich versuche Android Studio. Beim Erstellen eines neuen Projekts und Hinzufügen einer Standardmethode onSaveInstanceState zu der MyActivity-Klasse erstellen, wenn ich versuche, den Code an Git zu committieren, bekomme ich einen seltsamen Fehler, den ich nicht verstehe. Der Code ist dies:Bedeutung von Android Studio Fehler: Nicht mit Anmerkungen versehene Parameter überschreibt @NonNull Parameter

Der Fehler, den ich bekommen, ist dies:

enter image description here

Wenn ich versuche, die Methodensignatur zu protected void onSaveInstanceState(@NotNull Bundle outState) zu ändern, dann die IDE mir sagt, es kann nicht lösche das Symbol NotNull.

Was muss ich tun, um die Warnung loszuwerden?

+0

Import '@ NotNull'? – chrylis

Antwort

85

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

protected void onSaveInstanceState(@NonNull Bundle outState) 

(und auch)

import android.support.annotation.NonNull; 

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

The @NonNull annotation can be used to indicate that a given parameter can not be null.

If a local variable is known to be null (for example because some earlier code checked whether it was null), and you pass that as a parameter to a method where that parameter is marked as @NonNull, the IDE will warn you that you have a potential crash.

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


In diesem Fall ist die besondere Warnung, dass die ursprüngliche Methode Sie überschreiben (in Activity) eine @NonNull Anmerkung auf dem outState Parameter hat, aber du hast es nicht in dem übergeordneten Verfahren umfasst. Nur Zugabe sollte das Problem beheben, das heißt

@Override 
protected void onSaveInstanceState(@NonNull Bundle outState) { 
    super.onSaveInstanceState(outState); 
} 
+4

Was ist der Zweck davon? –

+1

@IgorGanapolsky Sorry, hatte nicht erwähnt, dass, weil ich annahm, die Frage war nur über den "NotNull"/"NonNull" Unterschied. Angepasste Antwort entsprechend. – matiash

+2

Mit anderen Worten, IMHO, diese Annotation kann die notwendige Null-Überprüfung innerhalb einer Funktion entfernen und einen schnelleren Code haben. –

11

Eine Reihe von nützlichen support annotations vor kurzem im Android Support-Bibliothek hinzugefügt wurde. Ihre Hauptaufgabe besteht darin, Eigenschaften verschiedener Methoden und Parameter zu kommentieren, um Fehler zu finden. Wenn Sie beispielsweise den Wert null an einen Parameter übergeben, der mit der Anmerkung NotNull markiert ist, erhalten Sie eine Warnung.

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

Sie erhalten die Warnung, da die Bundle Parameter mit der @NotNull Annotation und durch Überschreiben der Methode der Anmerkung wird markiert:

Die Anmerkungen kann, indem Sie die folgende Abhängigkeit mit Gradle zu Ihrem Projekt hinzugefügt werden versteckt. Sie müssen die Annotation ebenfalls zum Parameter der überschriebenen Methode hinzufügen.

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

Zusätzlich zu den anderen Antworten, die @NonNull (und es ist Gegner, @Nullable) annotiert Annotations ein Feld, Parameter oder Rückgabetyp Methode. IntelliJ und damit Android Studio können Sie zur Kompilierzeit auf mögliche NullPointerException s warnen.

Ein Beispiel ist am besten hier:

@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 Annotationen nicht verändern Laufzeitverhalten (obwohl ich experimented mit diesem haben), aber zur Vermeidung von Fehlern als Werkzeug dienen.

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 ist, den Parameter selbst mit Anmerkungen zu versehen, wie Android Studio vorschlägt: