Android集成MapFragment调用getMapAsync触发空指针异常原因咨询
问题背景
开发集成GPS位置数据、嵌入Map组件的应用时,在自定义Fragment内部通过如下代码获取MapFragment实例:
val mapFragment = childFragmentManager.findFragmentById(com.example.sensorsapp.R.id.map_fragment) as com.google.android.gms.maps.MapFragment? mapFragment!!.getMapAsync(this)
运行后抛出空指针异常:
java.lang.NullPointerException at com.example.sensorsapp.Fragments.MapFragment.fetchLocation$lambda-1
存在地图对象初始化失败的问题,具体触发原因如下:
问题根因
- 类名冲突:自定义的宿主Fragment本身就命名为
MapFragment,和Google Maps SDK提供的com.google.android.gms.maps.MapFragment完全重名,存在类型引用混淆风险,findFragmentById返回的实例和目标强转类型不匹配时会得到null值,后续使用!!强制非空直接触发崩溃。 - 调用时机错误:如果在宿主Fragment的
onCreate生命周期阶段就调用childFragmentManager.findFragmentById,此时宿主Fragment的视图树还未完成加载,嵌套的子MapFragment还没被添加到子FragmentManager,方法会直接返回null。正确的调用时机应该是在onViewCreated及之后的生命周期节点。 - 布局配置不匹配:当前宿主Fragment加载的布局文件中,不存在id为
map_fragment的MapFragment控件,比如控件id写错、布局里声明的是SupportMapFragment而非SDK的MapFragment、甚至忘了在布局里添加MapFragment节点,都会导致查找失败返回null。 - 写法存在安全隐患:使用
!!强制对可空类型的mapFragment做非空断言,完全跳过了空值判断逻辑,只要查找实例失败就会立刻触发NPE,没有任何容错兜底。
内容的提问来源于stack exchange,提问作者Lampros Marantos
相关产品推荐
相关产品推荐

