Android kotlin.KotlinNullPointerException,尝试在kotlin中的搜索结果后在地图上添加标记时

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

我正在尝试在我的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(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