Daripada mencari akar masalah dalam kegelapan, saya pikir lebih baik menjelaskan bagaimana dan mengapa NPE disebabkan dan bagaimana mereka dapat dihindari, sehingga OP dapat menerapkan pengetahuan yang baru diperoleh untuk memburu masalah sepelenya sendiri.
Lihat, referensi objek (variabel) dapat berisi Object
yang layak penuh atau hanya tidak ada , yaitu null
.
SomeObject someObject1 = new SomeObject(); // References something.
SomeObject someObject2 = null; // References nothing.
Sekarang, jika Anda mencoba mengakses tidak ada (null
), maka Anda pasti akan mendapatkan NullPointerException
, hanya karena null
tidak memiliki variabel atau metode.
someObject1.doSomething(); // Works fine.
someObject2.doSomething(); // Throws NullPointerException.
Solusi ini cukup sederhana. Pada dasarnya dapat dilakukan dengan dua cara:baik dengan membuat instance atau hanya dengan mengabaikannya.
if (someObject2 == null) {
someObject2 = new SomeObject();
}
someObject2.doSomething(); // No NPE anymore!
atau
if (someObject2 != null) {
someObject2.doSomething(); // No NPE anymore!
}
Dalam kasus NPE, nomor baris pertama dari stacktrace menunjukkan garis yang tepat di mana itu disebabkan. Anda memberi tahu secara harfiah "baris 272 adalah admin.birthList.add(list1);
". Baris ini berisi dua tempat referensi objek diakses/dipanggil (menggunakan .
operator). Yang pertama adalah admin.birthList
dan yang kedua adalah birthList.add(list1)
. Terserah Anda untuk mengetahui apakah salah satu atau keduanya menyebabkan NPE. Jika ini adalah pemanggilan pertama, maka admin
hanya null
. Jika ini adalah pemanggilan kedua, maka birthList
hanya null
. Anda dapat memperbaikinya dengan membuat instance dengan objek yang layak penuh.
Sunting: Jika Anda kesulitan menentukan akar masalahnya (ternyata dari komentar), maka Anda perlu belajar debugging. Jalankan debugger atau lakukan "debug orang miskin" dengan bantuan System.out.println()
dari setiap variabel sebelum mengakses/memanggilnya. Pertama melihat garis di mana NPE disebabkan. Jika ini misalnya
admin.birthList.add(list1);
maka Anda perlu mengubahnya sebagai berikut untuk mengetahui akar masalahnya:
System.out.println("admin: " + admin);
List<Birth> birthList = admin.birthList;
System.out.println("birthList: " + birthList);
birthList.add(list1);
periksa apakah ada di antara mereka yang mencetak null
. Atau Anda juga dapat melakukan:
if (admin == null) throw new NullPointerException("admin is null!");
List<Birth> birthList = admin.birthList;
if (birthList == null) throw new NullPointerException("birthList is null!");
birthList.add(list1);
Anda juga dapat memisahkan doa individu melalui baris terpisah sehingga Anda memiliki cukup nomor baris untuk mengetahui referensi mana yang nol.
List<Birth> birthList = admin.birthList; // If NPE line points here, then admin is null.
birthList.add(list1); // If NPE line points here, then birthList is null.