java.lang.NullPointerException FusedLocationProviderClient 崩溃:指定为非空的参数位置为空

FusedLocationProviderClient crash with java.lang.NullPointerException: parameter location specified as non-null is null

我在我的应用程序中使用 FusedLocationProviderClient,它可以很好地获取用户当前位置,但突然发生崩溃

java.lang.NullPointerException: Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkNotNullParameter, parameter location

这是我在 activity

中定义它的方式
private lateinit var fusedLocationClient: FusedLocationProviderClient

//

fusedLocationClient =
                    LocationServices.getFusedLocationProviderClient(this)

// 崩溃发生在 (addOnSuccessListener)

的下一个代码上
fusedLocationClient.lastLocation
            .addOnSuccessListener { location ->
                    lat = location.latitude
                    lng = location.longitude
                    goToLocationOnMap(LatLng(lat, lng))
            }

Task.OnSuccessListener 是一个 Java class,没有参数可空性注释(@NotNull@Null)。因此,Kotlin 无法确定该类型是可为空还是不可为空,并且编译器不会抱怨 location 的不安全使用(例如 location.latitude 而不是 location?.latitude)。

根据 docs:

,位置可以是 null 的情况有 3 种可能
  • 设备设置中的定位功能已关闭。即使先前检索到最后一个位置,结果也可能为空,因为禁用位置也会清除缓存。
  • 设备从未记录过位置,可能是新设备或已恢复出厂设置的设备。
  • Google设备上的播放服务已重启,服务重启后没有活动的Fused Location Provider客户端请求定位。

总结:显式声明可空性并处理空场景[=​​17=]