Arti kesalahan Android Studio: Bukan parameter yang dianotasi menggantikan parameter @NonNull

104

Saya mencoba Android Studio. Saat membuat proyek baru dan menambahkan onSaveInstanceStatemetode default ke kelas create MyActivity, ketika saya mencoba memasukkan kode ke Git, saya mendapatkan kesalahan aneh yang tidak saya mengerti. Kodenya begini:

Kesalahan yang saya dapatkan adalah ini:

masukkan deskripsi gambar di sini

Jika saya mencoba mengubah tanda tangan metode menjadi protected void onSaveInstanceState(@NotNull Bundle outState), maka IDE memberi tahu saya bahwa ia tidak dapat menyelesaikan simbol NotNull.

Apa yang harus saya lakukan untuk menghilangkan peringatan tersebut?

Monomo
sumber

Jawaban:

124

Itu anotasi, tapi nama yang benar adalah NonNull:

protected void onSaveInstanceState(@NonNull Bundle outState)

(Dan juga)

import android.support.annotation.NonNull;

Tujuannya adalah untuk memungkinkan kompilator memberi peringatan ketika asumsi tertentu dilanggar (seperti parameter metode yang harus selalu memiliki nilai, seperti dalam kasus khusus ini, meskipun ada yang lain). Dari dokumentasi Anotasi Dukungan :

The @NonNullanotasi dapat digunakan untuk menunjukkan bahwa parameter yang diberikan tidak dapat null.

Jika variabel lokal diketahui null (misalnya karena beberapa kode sebelumnya memeriksa apakah itu null), dan Anda meneruskannya sebagai parameter ke metode di mana parameter itu ditandai sebagai @NonNull, IDE akan memperingatkan Anda bahwa Anda telah potensi kecelakaan.

Mereka adalah alat untuk analisis statis. Perilaku runtime tidak diubah sama sekali.


Dalam kasus ini, peringatan khususnya adalah bahwa metode asli yang Anda timpa Activitymemiliki @NonNullanotasi pada outStateparameter, tetapi Anda tidak memasukkannya ke dalam metode penggantian. Hanya menambahkannya akan memperbaiki masalah, yaitu

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
}
matiash
sumber
5
Apa tujuannya?
IgorGanapolsky
2
@IgorGanapolsky Maaf, saya tidak menyebutkannya karena saya menganggap pertanyaannya hanya tentang NotNull/ NonNullperbedaan. Jawaban yang disesuaikan.
matiash
2
Dengan kata lain, IMHO, anotasi ini dapat menghilangkan kebutuhan pemeriksaan null di dalam suatu fungsi, dan memiliki kode yang lebih cepat.
John Pang
1
@JohnPang Anda bisa , tetapi karena batasan yang disiratkan oleh anotasi tidak dijamin benar-benar diberlakukan, itu mungkin bukan ide yang baik.
matiash
impor android.support.annotation.NonNull; mencari hal ini selama 2 jam ... tidak ada yang menyebutkan cara mengimpor NonNull .. maka upvote
Shirish Herwade
15

Sejumlah anotasi dukungan yang berguna baru-baru ini ditambahkan di pustaka dukungan Android. Peran utama mereka adalah memberi anotasi pada properti berbagai metode dan parameter untuk membantu menangkap bug. Misalnya, jika Anda meneruskan nullnilai ke parameter yang ditandai dengan NotNullanotasi, Anda akan mendapatkan peringatan.

Anotasi dapat ditambahkan ke proyek Anda dengan Gradle dengan menambahkan dependensi berikut:

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

Anda mendapatkan peringatan karena Bundleparameter ditandai dengan @NotNullanotasi dan dengan mengganti metode anotasi disembunyikan. Hal yang benar untuk dilakukan adalah menambahkan anotasi ke parameter metode yang diganti juga.

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

Selain jawaban lain @NonNull, @Nullableanotasi (dan lawannya, ) menganotasi bidang, parameter, atau jenis kembalian metode. IntelliJ dan Android Studio bisa memperingatkan Anda tentang kemungkinan NullPointerExceptionwaktu kompilasi.

Contoh yang terbaik di sini:

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

Anotasi ini tidak mengubah perilaku runtime (meskipun saya telah bereksperimen dengan ini), tetapi berfungsi sebagai alat untuk mencegah bug.

Perhatikan bahwa pesan yang Anda terima bukanlah sebuah kesalahan, tetapi hanya sebuah peringatan, yang aman untuk diabaikan, jika Anda mau. Alternatifnya adalah dengan membuat anotasi sendiri pada parameter, seperti yang disarankan Android Studio:

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