扩展Java类时,处理Kotlin中的空情况的最佳方法是什么?

当Kotlin中的某些东西可能为null时,我真的被这种情况困住了。 当一个值不能为空 – 很明显。 但是,如果默认情况下可以为空,该如何处理情况。 看看这个例子:

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为null呢 。 在这种情况下我应该做什么? 我在使用java时遇到了这个问题。

好吧,在Java中,如果map为null,我们将得到NPE。

对我而言,NPE总比没有好。 程序崩溃,这是我的信号,有什么不对,我应该修复它。 这样,我甚至不能追查我的问题,为什么会发生。 是的,我们可以写下如下的东西:

 override fun onMapReady(map: GoogleMap?) { if (map != null) { this.map = map } else { Log.d("Activity","MapIsNull") } } 

这个代码有一些意思,是的。 但是我对整个无效安全的事情还是有一些犹豫。 安全的呼叫,例如是奇怪的东西,它产生无效和(在我看来)heisenbugs或难以捉住的错误。

有人可以向我解释这里发生了什么,使用无效安全的最佳做法是什么?

我很确定这个东西是有用的,因为我不像JB里的家伙那么聪明

OnMapReadyCallback的文档明确表示它“提供了一个非空的GoogleMap实例”。 因此, onMapReady方法的参数类型应使用非null类型。

请注意,当您在Kotlin中实现Java接口时,您可以选择是否将实现方法的参数声明为可为空或非空。 IDE将它们标记为可空,因为它是安全的默认值,但如果这是您所需要的,则可以将它们更改为非null。

关于处理空值:假设你需要在fun onMapReady(map: GoogleMap?)上有一个fun onMapReady(map: GoogleMap?)的方法来设置类属性map

您有两个设计选项可供选择:

1)如果mapnull则您的应用程序将不起作用

 class A { lateinit var map: GoogleMap // never ever `null` fun onMapReady(map: GoogleMap?) { map = map!! // throws } fun onMapReady2(map: GoogleMap?) { map = map ?: throw Exception("in case you care for the exception") } } 

2) Null对你有特殊意义,可以有:

 class A { var map: GoogleMap? = null // map is not ready yet fun onMapReady(map: GoogleMap?) { map = map } } 

当然,如果你的情况是(1),你可以控制API,那么你不应该有一个可为空的接收器map: GoogleMap? 因为它混淆了课程的用户。

我看到两个不同的问题:
1.空处理
2. Kotlin空处理的特定语法

首先不是kotlin特定的问题。 这取决于,@voddan几乎解释了可用的策略。

关于语法。 如果您只对非空值感兴趣,请使用let()

 override fun onMapReady(map: GoogleMap?) { map?.let { m -> // do your staff // 'm' now is definitely not null } } 

如果你想知道什么时候它是空的,使用通常的if-else块

 override fun onMapReady(map: GoogleMap?) { if (map != null) { this.map = map } else { Log.d("Activity","MapIsNull") } 

图片的标题说明:
1] @Cedric有关于kotlin的let()和朋友的好帖子
2]查看@ yole的评论 。 当在IDEA参数中重写乐趣时可以标记为“?”,但实际上它们不是。