You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin lateinit属性未初始化崩溃排查求助

问题分析:lateinit属性运行时变回未初始化导致崩溃

问题背景

我们的Android项目采用Kotlin开发,所有Fragment均继承自BaseFragment,HomeActivity作为启动Activity并提供通用功能。在BaseFragment的onCreate方法中调用HomeActivity的hideNavigationMenu时,触发kotlin.UninitializedPropertyAccessException,提示lateinit属性homeActivityBinding未初始化。该崩溃已在Firebase Crashlytics上报200+次,但本地无法复现。HomeActivity是首个启动的Activity,崩溃并非启动时触发,而是在运行一段时间后出现,无法理解已初始化的lateinit属性为何会变回未初始化状态。

相关代码

HomeActivity代码

class HomeActivity : HomeActivityContract.View {

    private val presenter: HomeActivityContract.Presenter by inject {
        parametersOf(Schedulers.computation())
    }
    override val selectedWatchList: WatchlistItem
        get() = homeActivityBinding.watchlistSpinner.selectedWatchList
    override val watchlistItems: MutableList<WatchlistItem>
        get() = homeActivityBinding.watchlistSpinner.watchlistItems

    val bag = CompositeDisposable()
    lateinit var homeActivityBinding: ActivityHomeBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (presenter.hasAccount) {
            homeActivityBinding = ActivityHomeBinding.inflate(layoutInflater)
            setContentView(homeActivityBinding.root)
            Observables.combineLatest(
                realtimeDatabaseService.enableMaintenancePageForPhone,
                realtimeDatabaseService.maintenanceDate
            ) { isEnabled, _mMsg ->
                if (isEnabled) {
                    homeActivityBinding.homeMaintenanceView.root.visibility = View.VISIBLE
                    homeActivityBinding.homeParentView.visibility = View.GONE
                    homeActivityBinding.homeMaintenanceView.maintenanceTV.text = getString(R.string.maintenance_msg, _mMsg)
                } else {
                    homeActivityBinding.homeMaintenanceView.root.visibility = View.GONE
                    homeActivityBinding.homeParentView.visibility = View.VISIBLE

                    presenter.attachView(this)

                    presenter.dataProvider.getAccountUpdate()
                        .subscribeBy(onError = { it.printStackTrace() }, onNext = {
                            presenter.sendDeviceIdForCurrentAccount(isNotificationsEnabledInSettings)
                        }).disposeBy(lifecycle.disposers.onDestroy)

                    setSupportActionBar(homeActivityBinding.homeToolbar)
                
                    presenter.start()
                }
            }
                .subscribe()
                .disposeBy(lifecycle.disposers.onDestroy)
        } else {
            val intent = Intent(this, LoginActivity::class.java).apply {
                addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
            }
            startActivity(intent)
            finish()
        }
    }

    fun hideNavigationMenu() {
        homeActivityBinding.homeNavigationView.visibility = View.GONE // 此处提示homeActivityBinding未初始化
    }
}

BaseFragment代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    if (isAdded)
        parentFragmentManager.let { fragmentManager ->
            takeIf { fragmentManager.backStackEntryCount >= 1 }?.let {
                    (activity as? HomeActivity)?.hideNavigationMenu()
             }
        }
}

崩溃报告

Caused by kotlin.UninitializedPropertyAccessException: lateinit property homeActivityBinding has not been initialized
       at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.G5(HomeActivity.kt:7)
       at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.hideNavigationMenu(HomeActivity.kt:404)
       at com.app.android.traderpro.etx.fragments.BaseFragment.hideNavigationMenu(BaseFragment.kt:138)
       at com.app.android.traderpro.etx.fragments.BaseFragment.onCreate(BaseFragment.kt:153)
       at androidx.fragment.app.Fragment.performCreate(Fragment.java:3090)
       at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257)
       at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
       at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1424)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2968)
       at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2875)
       at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:252)
       at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:220)
       at com.app.android.traderpro.etx.activities.BaseActivity.onCreate(BaseActivity.kt:61)
       at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.onCreate(HomeActivity.kt:134)
       at android.app.Activity.performCreate(Activity.java:8207)
       at android.app.Activity.performCreate(Activity.java:8191)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3819)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4022)
       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2336)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8653)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

恳请各位帮忙分析已初始化的lateinit属性为何会再次变为未初始化状态。

内容的提问来源于stack exchange,提问作者srisindhu saride

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:01:00