Penyebab Error dan Cara Mengatasi Lateinit Property Has Not Been Initialized Kotlin di Android

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 lateinit sebelum akses.
  • Akses terlalu cepat, contoh memakai view di onCreate sebelum setContentView atau binding diisi.
  • Flow lifecycle salah, contoh properti Fragment dipakai setelah onDestroyView atau 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

  1. Temukan baris crash di Logcat dan catat nama properti lateinit.
  2. Cek urutan init, pastikan assignment selalu terjadi sebelum baris tersebut.
  3. Tambah guard if(::adapter.isInitialized) untuk jalur async atau lifecycle yang tidak pasti.
  4. Ganti ke nullable atau lazy bila 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 lazy untuk 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.