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=]
我在我的应用程序中使用 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=]