Android Studio hatasının anlamı: Ek açıklamalı olmayan parametre geçersiz kılar @NonNull parametresi


104

Android Studio'yu deniyorum. Yeni bir proje onSaveInstanceStateoluşturduktan ve create MyActivity sınıfına varsayılan bir yöntem ekledikten sonra , kodu Git'e kaydetmeye çalıştığımda anlamadığım garip bir hata alıyorum. Kod şudur:

Aldığım hata şudur:

görüntü açıklamasını buraya girin

Yöntem imzasını olarak değiştirmeye çalışırsam protected void onSaveInstanceState(@NotNull Bundle outState), IDE bana sembolü çözemeyeceğini söylüyor NotNull.

Uyarıdan kurtulmak için ne yapmam gerekiyor?

Yanıtlar:


124

Bu bir ek açıklamadır, ancak doğru ad NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(Ve ayrıca)

import android.support.annotation.NonNull;

Amaç, derleyicinin belirli varsayımlar ihlal edildiğinde uyarmasına izin vermektir (örneğin, bu özel durumda olduğu gibi, her zaman bir değeri olması gereken bir yöntemin parametresi, ancak diğerleri de vardır). Gönderen Destek Açıklamalar belgeler:

@NonNullEk açıklama belirli bir parametre null olamaz belirtmek için kullanılabilir.

Yerel bir değişkenin boş olduğu biliniyorsa (örneğin, daha önceki bir kodun boş olup olmadığını kontrol ettiği için) ve bunu bir parametrenin @NonNull olarak işaretlendiği bir yönteme parametre olarak iletirseniz, IDE sizi potansiyel bir çarpışma.

Statik analiz için araçlardır. Çalışma zamanı davranışı hiç değişmez.


Bu durumda, özel uyarı, geçersiz kıldığınız (içinde Activity) orijinal yöntemin parametre @NonNullüzerinde bir açıklama outStateiçermesi, ancak bunu geçersiz kılma yöntemine dahil etmemiş olmanızdır. Sadece eklemek sorunu çözmelidir, yani

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

5
Bunun amacı ne?
IgorGanapolsky

2
@IgorGanapolsky Üzgünüm, bundan bahsetmemiştim çünkü sorunun sadece NotNull/ NonNullfarkla ilgili olduğunu varsaydım . Cevap buna göre ayarlandı.
matiash

2
Başka bir deyişle, IMHO, bu açıklama, bir işlevin içinde gerekli olan boşluğu kontrol etmeyi kaldırabilir ve daha hızlı bir koda sahip olabilir.
John Pang

1
@JohnPang Sen olabilir açıklama ima kısıtlama aslında uygulanmak üzere garanti edilmez, ancak, bu iyi bir fikir olmayabilir.
matiash

ithal android.support.annotation.NonNull; 2 saat boyunca bu şeyi arıyorum ... kimse NonNull'u nasıl ithal edeceğinden bahsetmedi .. bu yüzden oy verin
Shirish Herwade

15

Android destek kitaplığına yakın zamanda bir dizi faydalı destek açıklaması eklenmiştir. Birincil görevleri, hataları yakalamaya yardımcı olmak için çeşitli yöntem ve parametrelerin özelliklerine açıklama eklemektir. Örneğin null, NotNullek açıklama ile işaretlenmiş bir parametreye değer iletirseniz bir uyarı alırsınız.

Ek açıklamalar, aşağıdaki bağımlılık eklenerek Gradle ile projenize eklenebilir:

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

Uyarıyı alıyorsunuz çünkü Bundleparametre @NotNullek açıklama ile işaretlenmiş ve ek açıklama yöntemi geçersiz kılarak ek açıklama gizleniyor. Yapılacak doğru şey, ek açıklamayı geçersiz kılma yönteminin parametresine de eklemektir.

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

9

Diğer cevaplara ek olarak, @NonNull(ve rakibinin @Nullable) ek açıklaması bir alan, parametre veya yöntem dönüş türünü açıklar. IntelliJ ve dolayısıyla Android Studio NullPointerException, derleme sırasında olası sorunlara karşı sizi uyarabilir .

Burada bir örnek en iyisidir:

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

Bu ek açıklamalar (I rağmen değil alter çalışma zamanı davranışı yapmak tecrübe ile bu), ancak hataları önlemek için bir araç olarak hizmet vermektedir.

Aldığınız mesajın bir hata olmadığını, sadece bir uyarı olduğunu unutmayın, eğer seçerseniz, göz ardı etmek güvenlidir. Alternatif, Android Studio'nun önerdiği gibi parametreye kendiniz de açıklama eklemektir:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.