Android kotlin.KotlinNullPointerException,尝试在kotlin中的搜索结果后在地图上添加标记时
我正在尝试在我的kotlin android应用程序中实现google places search autocomplete SDK 我使用官方文件中列出的第二种方法: 这是我的密码:Android kotlin.KotlinNullPointerException,尝试在kotlin中的搜索结果后在地图上添加标记时,android,kotlin,Android,Kotlin,我正在尝试在我的kotlin android应用程序中实现google places search autocomplete SDK 我使用官方文件中列出的第二种方法: 这是我的密码: private var fromLocation: LatLng? = LatLng(0.0, 0.0) private var toLocation: LatLng? = LatLng(0.0, 0.0) override fun onActivityResult(reque
private var fromLocation: LatLng? = LatLng(0.0, 0.0)
private var toLocation: LatLng? = LatLng(0.0, 0.0)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
val place: Place? = data?.let { Autocomplete.getPlaceFromIntent(it) }
if (PLACE_PICKING_MODE == 1) {
fromLocation = place?.latLng
val theIcon = R.drawable.gps_default
placeMarkerOnMap(fromLocation, theIcon)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(fromLocation, 17f))
} else if (PLACE_PICKING_MODE == 2) {
toLocation = place?.latLng
val theIcon = R.drawable.gps_default
placeMarkerOnMap(toLocation, theIcon)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(toLocation, 17f))
}
} else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
// TODO: Handle the error.
val status: Status = Autocomplete.getStatusFromIntent(data!!)
} else if (resultCode == RESULT_CANCELED) {
println("user Canceled")
}
}
if (requestCode == REQUEST_CHECK_SETTINGS) {
if (resultCode == Activity.RESULT_OK) {
locationUpdateState = true
startLocationUpdates()
}
}
}
最后,每次都会出现错误kotlin.KotlinNullPointerExceptio
更新
根据答案,我将IF语句中的几行更改为:
if (PLACE_PICKING_MODE == 1) {
if (place != null) {
fromLocation = place.latLng!!
}
val theIcon = R.drawable.gps_default
placeMarkerOnMap(fromLocation, theIcon)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(fromLocation, 17f))
} else if (PLACE_PICKING_MODE == 2) {
if (place != null) {
toLocation = place.latLng!!
}
val theIcon = R.drawable.gps_default
placeMarkerOnMap(toLocation, theIcon)
map.animateCamera(CameraUpdateFactory.newLatLngZoom(toLocation, 17f))
}
但它还是给了我一个错误:
向活动{com.innoventiq.arkbeh/com.innoventiq.arkbeh.MainActivity}传递结果ResultInfo{who=null,request=4,result=-1,data=Intent{(有附加项)}}失败:kotlin.KotlinNullPointerException
并向我指出以下几行:
fromLocation=place.latLng代码>
及
toLocation=place.latLng代码>查看您得到的错误代码,它应该确定是哪一行导致了NullPointerException
如果data=null
(因为它是可为null的类型?),那么位置也将是null
(data?。在这种情况下,{…}
块只返回null
)。这会在三个方面引发问题:
在第一个if(PLACE_PICKING_MODE==1)
块中,fromLocation
现在也将是null
,并且您对placeMarkerOnMap
的调用带有该位置的null
值
在第二个if
块中,与toLocation
从意图获取状态时,如果数据
为空
,数据代码>抛出一个KotlinNullPointerException
在执行任何条件逻辑之前,您可能只需要执行更多的null
检查
编辑
执行null
检查的一个好方法是执行以下操作
val place: Place? = data?.let { Autocomplete.getPlaceFromIntent(it) }
if (requestCode == AUTOCOMPLETE_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
val place: Place? = data?.let { Autocomplete.getPlaceFromIntent(it) }
place?.let { //One time null-check for place
if (PLACE_PICKING_MODE == 1) {
fromLocation = it.latLng
val theIcon = R.drawable.gps_default
placeMarkerOnMap(fromLocation, theIcon)
map.animateCamera(CameraUpdateFactory.
newLatLngZoom(fromLocation, 17f))
} else if (PLACE_PICKING_MODE == 2) {
toLocation = it.latLng
val theIcon = R.drawable.gps_default
placeMarkerOnMap(toLocation, theIcon)
map.animateCamera(CameraUpdateFactory.
newLatLngZoom(toLocation, 17f))
}
}
} else if (resultCode == AutocompleteActivity.RESULT_ERROR) {
// TODO: Handle the error.
val status: Status = Autocomplete.getStatusFromIntent(data!!)
} else if (resultCode == RESULT_CANCELED) {
println("user Canceled")
}
}
但是,如果您查看原始问题中链接的文档,实际上可以删除data?,让{…}
检查,因为通常的函数实际上将数据设置为不可为空。函数签名
override fun onActivityResult(int requestCode, int resultCode, Intent data)
实际上,保证意图永远不应为null
,除非您在代码中将其设置为null
。真正的问题应该是place.latLng
是null
,可能不应该是。但是,如果你的最终应用程序中存在这种可能性,你需要对其执行空检查并处理错误。我尝试了它,但出现了另一个错误,请检查更新的问题。根据上一个错误,似乎place
不是null
,而是place.latLng
是。(使用!!
运算符断言您希望该值不为null,因此当它实际上为null时,它会抛出KotlinNullPointException
)。我不知道为什么会这样,但我假设函数接收到的意图没有以某种方式格式化,从而为您提供一个有效的位置。latLng
。在它们被创建之后立即记录它们的意图和位置,以查看发生了什么,这可能是一个好主意。我还将更新我的答案以帮助您进行空值检查。在我看来,latLng
是空的,在早期版本中,您没有place.latLng代码>。