Kotlin中let块调用nullable对象方法报错,提示需安全调用如何解决?
问题原因与解决方案
为什么会报错?
你写的parent.let是普通调用,不管parent是不是null,这个let块都会执行。当parent为null时,it的类型依然是ParentInterface?(可空类型),所以直接调用it.getWidth()会触发Kotlin的空安全检查报错。你误以为let加?:能实现类似else的逻辑,但实际上只有用安全调用的?.let,才会只在parent非null时执行块内代码。
正确写法
写法一:用?.let配合?:(推荐)
return parent?.let { it.getWidth() * (perWidth / 100.0f) } ?: App.realWidth.toFloat()
parent?.let:只有parent非null时才会执行块内代码,此时it会被Kotlin智能转换为非null的ParentInterface类型,直接调用getWidth()完全安全。- 如果
parent为null,?.let会返回null,这时?:就会执行后面的默认值逻辑。
写法二:用if-else结构(更直观)
如果觉得let的写法有点绕,也可以用最直接的if判断:
return if (parent != null) { parent.getWidth() * (perWidth / 100.0f) } else { App.realWidth.toFloat() }
内容的提问来源于stack exchange,提问作者NullPointerException
相关产品推荐
相关产品推荐

