findViewById() dapat menghasilkan NullPointerException

Saya mendapat banyak panggilan berikut:

(ListView) getView().findViewById(R.id.main_list_view);
(TextView) getView().findViewById(R.id.items_no);
....

dan AndroidStudio memberi tahu saya bahwa mereka mungkin menghasilkan NullPointerException:

Pemanggilan metode getView().findViewById(R.id.main_list_view) mungkin menghasilkan java.lang.NullPointerException lebih sedikit... (Ctrl+F1)

Inspeksi ini menganalisis kontrol metode dan aliran data untuk melaporkan kemungkinan kondisi yang selalu benar atau salah, ekspresi yang nilainya terbukti konstan secara statis, dan situasi yang dapat menyebabkan pelanggaran kontrak nullability.

Variabel, parameter metode, dan nilai kembalian yang ditandai sebagai @Nullable atau @NotNull diperlakukan sebagai nullable (atau bukan-null) dan digunakan selama analisis untuk memeriksa kontrak nullability, misalnya kontrak nullability. laporkan kemungkinan NullPointerException kesalahan.

Kontrak yang lebih kompleks dapat ditentukan menggunakan anotasi @Contract, misalnya:

@Contract("_, null -> null") — metode mengembalikan null jika argumen kedua adalah null @Contract("_, null -> null; _, !null -> !null") — metode mengembalikan null jika argumen kedua adalah null dan bukan-null sebaliknya

@Contract("true -> fail") — metode assertFalse tipikal yang memunculkan pengecualian jika nilai true diteruskan ke metode tersebut

Inspeksi dapat dikonfigurasi untuk menggunakan anotasi @Nullable @NotNull khusus (secara default, anotasi dari annotations.jar akan digunakan)

Untungnya semuanya berfungsi, tetapi apakah ada perbaikan pada kode yang dapat saya lakukan?


person Phate01    schedule 12.11.2015    source sumber
comment
Anda ingin menulis kode yang tidak mungkin dilakukan melalui NPE?   -  person takendarkk    schedule 12.11.2015
comment
Apakah Anda menggunakan pola ViewHolder?   -  person SKT    schedule 12.11.2015
comment
@takendarkk tidak, tapi saya ingin memahami mengapa ide memberi tahu saya bahwa hal itu bisa terjadi   -  person Phate01    schedule 12.11.2015
comment
Karena apa jadinya jika Anda memberikan metode tersebut id yang tidak ada? Ini mengembalikan nol. Tidak ada yang salah sama sekali.   -  person takendarkk    schedule 12.11.2015
comment
Saya mengerti, tetapi apakah ada perbaikan pada kode yang dapat saya lakukan?   -  person Phate01    schedule 12.11.2015
comment
Tidak disini. ADALAH. TIDAK ADA APA-APA. SALAH.   -  person takendarkk    schedule 12.11.2015


Jawaban (3)


Ini adalah masalah umum di Android.support.v7.app.AppCompatActivity dan telah diperbaiki di v24.

https://code.google.com/p/android/issues/detail?id=203345

Anda tidak akan mengalami masalah apa pun dengan Android.support.v4.app.FragmentActivity atau Android.app.Activity

person Gayan Weerakutti    schedule 07.09.2016

Anda harus mengabaikan masalahnya;

Seperti yang ditulis @DanDar3 -> getView() dapat mengembalikan null dan AndroidStudio menyorotinya.

Namun jika Anda benar-benar ingin membuat AndroidStudio senang - tentu Anda bisa...:
Tegaskan saja view is not null:

View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);
person Witold Kaczurba    schedule 23.09.2017

Itu karena getView() dapat mengembalikan nol dan dianotasi sebagai @Nullable, periksa sumber dan JavaDoc-nya - CTRL+Klik pada panggilan getView() dalam kode Anda.

/**
 * Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
 * if provided.
 * 
 * @return The fragment's root view, or null if it has no layout.
 */
@Nullable
public View getView() {
    return mView;
}

Anda dapat membungkus kode Anda sendiri dan memeriksa null agar peringatannya hilang, atau letakkan kursor di mana saja di dalam panggilan findViewById(), tunggu beberapa detik hingga bola lampu muncul (atau tekan Alt+Enter) lalu pilih salah satu dari solusi yang disarankan.

person Dan Dar3    schedule 03.02.2016