Znaczenie błędu Android Studio: parametr bez adnotacji zastępuje parametr @NonNull

104

Wypróbowuję Android Studio. Po utworzeniu nowego projektu i dodaniu onSaveInstanceStatemetody domyślnej do klasy create MyActivity, kiedy próbuję przekazać kod do Gita, pojawia się dziwny błąd, którego nie rozumiem. Oto kod:

Otrzymuję następujący błąd:

wprowadź opis obrazu tutaj

Jeśli spróbuję zmienić sygnaturę metody na protected void onSaveInstanceState(@NotNull Bundle outState), IDE mówi mi, że nie może rozpoznać symbolu NotNull.

Co muszę zrobić, aby pozbyć się ostrzeżenia?

Monomo
źródło

Odpowiedzi:

124

To adnotacja, ale poprawna nazwa to NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(I również)

import android.support.annotation.NonNull;

Ma to na celu umożliwienie kompilatorowi ostrzeżenia o naruszeniu pewnych założeń (takich jak parametr metody, który zawsze powinien mieć wartość, tak jak w tym konkretnym przypadku, chociaż są inne). Z dokumentacji adnotacji pomocy technicznej :

@NonNullAdnotacja może być używany do wskazania, że dany parametr nie może być null.

Jeśli wiadomo, że zmienna lokalna ma wartość null (na przykład, ponieważ jakiś wcześniejszy kod sprawdzał, czy była pusta) i przekażesz to jako parametr do metody, w której ten parametr jest oznaczony jako @NonNull, IDE ostrzeże Cię, że masz potencjalna awaria.

Są narzędziami do analizy statycznej. W ogóle nie zmienia się zachowania środowiska wykonawczego.


W tym przypadku szczególnym ostrzeżeniem jest to, że oryginalna metoda, którą nadpisujesz (in Activity), ma @NonNulladnotację na outStateparametrze, ale nie uwzględniono go w nadpisywanej metodzie. Samo dodanie powinno rozwiązać problem, tj

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
matiash
źródło
5
Jaki jest tego cel?
IgorGanapolsky,
2
@IgorGanapolsky Przepraszamy, nie wspomniałem o tym, ponieważ założyłem, że pytanie dotyczy tylko NotNull/ NonNullróżnicy. Odpowiednio dostosowana odpowiedź.
matiash
2
Innymi słowy, IMHO, ta adnotacja może wyeliminować konieczność sprawdzania wartości null wewnątrz funkcji i mieć szybszy kod.
John Pang,
1
@JohnPang Ty mógł , ale ponieważ ograniczenie nakazywałby adnotacji nie jest gwarantowana być rzeczywiście egzekwowane, to może nie być dobrym pomysłem.
matiash
import android.support.annotation.NonNull; Szukam tej rzeczy przez 2 godziny ... nie jeden wspomniano jak importować niepustych .. stąd upvote
Shirish Herwade
15

Wiele przydatnych adnotacji pomocy zostało niedawno dodanych do biblioteki obsługi Androida. Ich główną rolą jest opisywanie właściwości różnych metod i parametrów, aby pomóc wyłapać błędy. Na przykład, jeśli przekażesz nullwartość do parametru, który jest oznaczony NotNulladnotacją, otrzymasz ostrzeżenie.

Adnotacje można dodać do projektu za pomocą Gradle, dodając następującą zależność:

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

Otrzymujesz ostrzeżenie, ponieważ Bundleparametr jest oznaczony @NotNulladnotacją i przez zastąpienie metody adnotacja zostaje ukryta. Należy również dodać adnotację do parametru nadpisanej metody.

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
LukaCiko
źródło
9

Oprócz innych odpowiedzi, adnotacja @NonNull(i jej przeciwnik @Nullable) zawiera adnotacje dotyczące typu zwracanego pola, parametru lub metody. IntelliJ, a tym samym Android Studio, może ostrzec Cię o możliwych NullPointerExceptionproblemach w czasie kompilacji.

Najlepszym przykładem jest tutaj:

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

Te adnotacje nie zmieniają zachowania w czasie wykonywania (chociaż eksperymentowałem z tym), ale służą jako narzędzie do zapobiegania błędom.

Zwróć uwagę, że otrzymana wiadomość nie była błędem, ale tylko ostrzeżeniem, które można bezpiecznie zignorować, jeśli zdecydujesz się to zrobić. Alternatywą jest samodzielne opisanie parametru, jak sugeruje Android Studio:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
nhaarman
źródło