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

Android开发:ReserveFragment构造调用引发初始化异常求助

Android Fragment实例化异常解决方案

问题根源

点击MapFragment的gotoBookingButton跳转至ReserveFragment时抛出实例化异常,核心原因是ReserveFragment的构造函数中直接访问了未初始化的lateinit属性sharedPref。Fragment由系统实例化时,构造函数执行阶段依赖注入(或属性初始化)尚未完成,此时访问lateinit属性必然触发UninitializedPropertyAccessException。

具体修复步骤

  • 移除构造函数中对sharedPref的所有访问:Android要求Fragment必须保留无参构造函数,且构造函数内不能执行依赖初始化、属性访问等操作,所有业务逻辑需移至生命周期方法中。
  • 将依赖初始化与业务逻辑移至生命周期方法:
    1. 若使用依赖注入框架(如Dagger),需在onCreate()或onAttach()中完成注入操作,确保sharedPref初始化后再访问:
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          AndroidInjection.inject(this) // 触发依赖注入
          // 此时sharedPref已初始化,可安全调用相关方法
          val userToken = sharedPref.getToken()
      }
      
    2. 若未使用依赖注入,需在onViewCreated()或onActivityCreated()中通过上下文初始化sharedPref:
      override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
          super.onViewCreated(view, savedInstanceState)
          sharedPref = SharedPref(requireContext())
      }
      
  • 校验依赖注入配置:确认ServerModule中SharedPref的绑定逻辑正确,保证Fragment能获取到有效实例,避免注入失败导致lateinit属性未初始化。

额外注意事项

  • 禁止在Fragment的构造函数、init代码块中访问需要上下文或依赖注入的属性,这类资源仅在Fragment生命周期启动后才可用。
  • 若使用lateinit属性,建议添加::sharedPref.isInitialized判断,提前规避未初始化访问风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 04:55:27