设置列表适配器时出现lateinit property has not been initialized异常求助
解决
lateinit property has not been initialized异常 问题原因
你在onCreate方法中直接使用tumBurcBilgileri创建适配器,但从未调用过初始化该变量的veriKaynagiHazirla()方法,导致标记为lateinit的变量在未完成初始化时就被访问,触发了UninitializedPropertyAccessException异常。
修复方案
方案1:提前调用初始化方法
在onCreate中创建适配器之前,先调用veriKaynagiHazirla()完成变量初始化:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 先初始化数据源 veriKaynagiHazirla() // 再创建适配器 val myBaseAdapter = BurclarBaseAdapter(this, tumBurcBilgileri) ListBurclar.adapter = myBaseAdapter }
方案2:避免使用lateinit(更安全)
直接在声明时初始化变量,从根源避免未初始化问题:
class MainActivity() : AppCompatActivity() { // 直接初始化空列表,无需lateinit private val tumBurcBilgileri = ArrayList<Burc>(12) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) veriKaynagiHazirla() val myBaseAdapter = BurclarBaseAdapter(this, tumBurcBilgileri) ListBurclar.adapter = myBaseAdapter } private fun veriKaynagiHazirla(){ val burclar = resources.getStringArray(R.array.Burc) val burcTarihleri = resources.getStringArray(R.array.burcTarih) val burcResimleri = arrayOf(R.drawable.koc1, R.drawable.boga2, R.drawable.ikizler3, R.drawable.yengec4, R.drawable.aslan5, R.drawable.basak6, R.drawable.terazi7, R.drawable.akrep8, R.drawable.yay9, R.drawable.oglak10, R.drawable.kova11, R.drawable.balik12) val buyukBurcResim = arrayOf(R.drawable.koc_buyuk1, R.drawable.boga_buyuk2, R.drawable.ikizler_buyuk3, R.drawable.yengec_buyuk4, R.drawable.aslan_buyuk5, R.drawable.basak_buyuk6, R.drawable.terazi_buyuk7, R.drawable.akrep_buyuk8, R.drawable.yay_buyuk9, R.drawable.oglak_buyuk10, R.drawable.kova_buyuk11, R.drawable.balik_buyuk12) val burcGenelOzellikler = resources.getStringArray(R.array.burcGenelOzellikler) for (i in 0..11){ val arayListeAtanacakBurc = Burc(burclar[i], burcTarihleri[i], burcResimleri[i], buyukBurcResim[i], burcGenelOzellikler[i]) tumBurcBilgileri.add(arayListeAtanacakBurc) } } }
额外提示
lateinit仅适用于非空类型变量,且必须在第一次访问前完成初始化,否则必然抛出异常。- 对于集合类变量,优先直接初始化或使用
lazy委托,能有效减少这类运行时异常的发生。
内容的提问来源于stack exchange,提问作者orhan berkil
相关产品推荐
相关产品推荐

