Android开发:ReserveFragment构造调用引发初始化异常求助
Android Fragment实例化异常解决方案
问题根源
点击MapFragment的gotoBookingButton跳转至ReserveFragment时抛出实例化异常,核心原因是ReserveFragment的构造函数中直接访问了未初始化的lateinit属性sharedPref。Fragment由系统实例化时,构造函数执行阶段依赖注入(或属性初始化)尚未完成,此时访问lateinit属性必然触发UninitializedPropertyAccessException。
具体修复步骤
- 移除构造函数中对sharedPref的所有访问:Android要求Fragment必须保留无参构造函数,且构造函数内不能执行依赖初始化、属性访问等操作,所有业务逻辑需移至生命周期方法中。
- 将依赖初始化与业务逻辑移至生命周期方法:
- 若使用依赖注入框架(如Dagger),需在
onCreate()或onAttach()中完成注入操作,确保sharedPref初始化后再访问:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) AndroidInjection.inject(this) // 触发依赖注入 // 此时sharedPref已初始化,可安全调用相关方法 val userToken = sharedPref.getToken() } - 若未使用依赖注入,需在
onViewCreated()或onActivityCreated()中通过上下文初始化sharedPref:override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) sharedPref = SharedPref(requireContext()) }
- 若使用依赖注入框架(如Dagger),需在
- 校验依赖注入配置:确认ServerModule中SharedPref的绑定逻辑正确,保证Fragment能获取到有效实例,避免注入失败导致lateinit属性未初始化。
额外注意事项
- 禁止在Fragment的构造函数、init代码块中访问需要上下文或依赖注入的属性,这类资源仅在Fragment生命周期启动后才可用。
- 若使用lateinit属性,建议添加
::sharedPref.isInitialized判断,提前规避未初始化访问风险。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

