Pesan lateinit property has not been initialized berarti kode membaca variabel lateinit var sebelum diberi nilai. Perbaikan tercepat: pastikan assignment berjalan dulu, lalu tambah guard if(::nama.isInitialized) sebelum properti dipakai di cabang yang rawan seperti callback, Fragment, atau Intent.
Penyebab Lateinit Property Belum Diinisialisasi
Kotlin tidak memberi nilai default pada lateinit. Compiler menunda pengecekan ke runtime, sehingga crash baru muncul saat properti diakses.
- lateinit: untuk var non-null yang diisi belakangan, misalnya setelah
onCreate. - nullable: untuk nilai yang memang boleh kosong, akses dengan
?.atau?:. - lazy: untuk nilai yang dihitung sekali saat pertama dipakai.
- ::nama.isInitialized: pengecekan khusus
lateinitsebelum akses. - Akses terlalu cepat, contoh memakai view di
onCreatesebelumsetContentViewatau binding diisi. - Flow lifecycle salah, contoh properti Fragment dipakai setelah
onDestroyViewatau Activity dibuka lewat Intent tanpa extra yang diharapkan.
Tabel Troubleshooting Error Lateinit di Kotlin
Lihat stacktrace, catat nama properti dan baris pemakaiannya, bukan baris deklarasinya.
| Pola Error | Penyebab | Solusi Cepat |
|---|---|---|
Crash di onCreate |
Dipakai sebelum findViewById atau binding |
Pindah pemakaian setelah inisialisasi view |
| Crash setelah rotasi layar | Activity dibuat ulang, nilai lama hilang | Isi ulang dari savedInstanceState atau Intent |
| Crash di Fragment | View diakses setelah onDestroyView |
Batasi akses sampai onDestroyView atau pakai nullable |
Cara Memperbaiki dengan Inisialisasi Aman
- Temukan baris crash di Logcat dan catat nama properti
lateinit. - Cek urutan init, pastikan assignment selalu terjadi sebelum baris tersebut.
- Tambah guard
if(::adapter.isInitialized)untuk jalur async atau lifecycle yang tidak pasti. - Ganti ke nullable atau
lazybila properti memang boleh kosong atau tergantung view.
class MainActivity : AppCompatActivity() {
private lateinit var adapter: UserAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
adapter = UserAdapter()
recyclerView.adapter = adapter
}
}
class HomeFragment : Fragment() {
private lateinit var token: String
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
token = requireArguments().getString("token").orEmpty()
if (::token.isInitialized && token.isNotEmpty()) {
loadData(token)
}
}
}
- Gunakan nullable
private var binding: FragmentHomeBinding?untuk view Fragment. - Gunakan
by lazyuntuk objek yang tidak butuh Context lebih awal. - Hindari
!!sebagai pengganti perbaikan urutan inisialisasi.
FAQ
Apakah ::variabel.isInitialized bisa mencegah crash?
Bisa untuk jalur tidak pasti, tetapi urutan inisialisasi yang benar tetap perbaikan utama.
Kapan pakai lateinit dan kapan pakai lazy atau nullable?
Pakai lateinit untuk var yang pasti diisi sebelum dipakai, lazy untuk inisialisasi sekali yang ditunda, nullable untuk data yang boleh kosong.
Kenapa error hanya muncul di perangkat tertentu?
Urutan lifecycle, kecepatan callback, atau Intent yang berbeda membuat assignment kadang terlewat.