Aplikasi force close karena NullPointerException hampir selalu berarti kode membaca objek yang ternyata null. Perbaikan tercepat yang aman: temukan baris dari Logcat, lalu ganti !! dengan ?. plus ?: return. Artikel ini memakai konteks Kotlin dengan View/XML, bukan Compose.
Penyebab NullPointerException Paling Sering di Android
Kotlin murni melarang null pada tipe non-null. NPE muncul ketika nilai datang dari Java atau Android API sebagai platform type, misalnya Intent.getStringExtra(), Bundle, atau view yang belum ada.
- Memakai
!!pada nilai nullable yang ternyata null. - Mengakses
lateinit varsebelum diinisialisasi. findViewByIdmemakai ID yang salah atau dipanggil sebelumsetContentView.- Mengakses view Fragment setelah
onDestroyView. - Membaca intent extra atau Fragment arguments yang tidak dikirim.
Tabel Cek Cepat NullPointerException
Buka Logcat, cari baris Caused by: java.lang.NullPointerException, lalu lihat nama file dan nomor baris di bawahnya. Baris itu menunjukkan objek null yang dipanggil.
| Masalah | Penyebab | Solusi |
|---|---|---|
Crash di textView.text = name!! |
name null |
Ganti dengan ?. dan ?: |
Crash lateinit property not initialized |
Diakses terlalu cepat | Cek ::prop.isInitialized |
findViewById null |
ID salah atau layout belum dipasang | Periksa ID dan urutan setContentView |
| Crash di Fragment | View sudah dihancurkan | Akses view hanya di rentang view lifecycle |
| Intent extra null | Key tidak dikirim | Pakai default atau validasi null |
- Crash terjadi setelah rotasi layar atau kembali dari background.
- Crash hanya muncul di Fragment, bukan Activity.
- Crash muncul pada klik pertama sebelum data dimuat.
Langkah Memperbaiki NullPointerException di Kotlin
Ikuti urutan ini agar perbaikan tidak menutup bug lain:
- Reproduksi crash dan catat file serta nomor baris dari Logcat.
- Ubah variabel berisiko menjadi nullable eksplisit, contoh
String?. - Ganti
!!dengan safe call?., Elvis?:, ataulet. - Untuk
lateinit, cekisInitializedatau pindah kelazybila nilainya dihitung sekali. - Untuk Activity dan Fragment, pastikan view, arguments, dan intent tersedia sesuai lifecycle sebelum dipakai.
val nama = intent.getStringExtra("nama") ?: return
textView?.text = nama
intent.getStringExtra("nama")?.let { value ->
textView.text = value
}
if (!::adapter.isInitialized) return
FAQ
Apakah !! boleh dipakai untuk mengatasi NPE?
Tidak, !! memaksa akses null dan justru memicu crash baru.
Kenapa findViewById atau viewBinding mengembalikan null?
Umumnya ID salah, layout belum dipasang, atau view Fragment sudah dihancurkan.
Kapan memakai lateinit, nullable, atau lazy agar tidak NPE?
Pakai lateinit untuk properti pasti diisi sebelum dipakai, nullable untuk data boleh kosong, dan lazy untuk nilai dihitung sekali saat pertama diakses.