当 Kotlin 中的某些内容可能为空时,我真的陷入了困境。当一个值不能为空时 - 很清楚。但是如何处理默认情况下可以为空的情况。看看这个例子:
abstract class MapActivity: AppCompatActivity(), OnMapReadyCallback {
lateinit var map: GoogleMap
fun initializeMap() {
val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
override fun onMapReady(map: GoogleMap?) {
this.map = map //error here
}
}
所以我应该这样处理这种情况:
override fun onMapReady(map: GoogleMap?) {
if (map != null)
this.map = map
}
但是如果 map 是 空 .在这种情况下我该怎么办?我在使用java时遇到了这个问题。
好的,在java中,如果map为null,我们将得到NPE。
对我来说,NPE 总比没有好。程序崩溃了,这对我来说是一个信号,表明出了点问题,我应该修复它。这样,我什至无法追踪我的问题以及它发生的原因。
是的,我们可以这样写:
override fun onMapReady(map: GoogleMap?) {
if (map != null) {
this.map = map
} else {
Log.d("Activity","MapIsNull")
}
}
这段代码有一些含义,是的。
但是对于整个零安全问题,我仍然有些犹豫。
例如,安全调用是一种奇怪的事情,它会产生 null 和(在我看来)难以捕捉的 heisenbug 或错误。
有人可以向我解释这里发生了什么,以及使用空安全的最佳做法是什么。
我很确定这东西很有用,因为我不像JB的人那么聪明
最佳答案
OnMapReadyCallback 的文档明确表示它“提供了 GoogleMap 的非空实例”。因此,onMapReady
的参数类型方法应该使用非空类型。
请注意,当您在 Kotlin 中实现 Java 接口(interface)时,您可以选择是否将实现方法的参数声明为可空或非空。 IDE 将它们标记为可为空,因为它是安全的默认设置,但如果您需要,您可以将它们更改为非空。
关于kotlin - 扩展 Java 类时,在 Kotlin 中处理 null 情况的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38021926/