Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa saya memiliki NullPointerException di sini?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang sebenarnya terjadi dengan operasi pengindeksan?

  2. Memasukkan data menggunakan mysqli

  3. Pencarian langsung menggunakan Codeigniter Mysql

  4. Permintaan Pembaruan MySQL dengan gabungan kiri dan grup oleh

  5. Apa yang salah dengan SQL saya di sini? #1089 - Kunci awalan salah