冗余空检查疑问:双重判空是否合理?doWithNull语句是否永不可达?
关于这段Kotlin代码的冗余空检查分析
先贴出你提到的代码:
error.timeoutInSeconds != null -> { error.timeoutInSeconds?.let { doWithNonNullTimeout(it) } ?: doWithNull("Timeout is null") }
1. 第一次空检查完全没有意义,属于冗余代码
进入这个分支的前提已经是error.timeoutInSeconds != null,所以分支内部的error.timeoutInSeconds肯定是非空的,完全不需要再用?.安全调用操作符。这段代码可以直接简化成:
error.timeoutInSeconds != null -> { doWithNonNullTimeout(error.timeoutInSeconds) }
如果非要保留let写法,也可以去掉安全调用:
error.timeoutInSeconds != null -> { error.timeoutInSeconds.let { doWithNonNullTimeout(it) } }
2. 你的判断正确,doWithNull("Timeout is null")永远不会被执行
因为进入这个分支的条件就是timeoutInSeconds不为空,所以?.let一定会执行lambda里的代码,let的返回值就是doWithNonNullTimeout(it)的结果。只有当let调用返回null时,?:才会触发退避逻辑,但从场景来看,doWithNonNullTimeout是用来处理非空超时值的,就算它真的返回null,逻辑上也不该走到doWithNull——毕竟我们已经确认了timeoutInSeconds是非空的,这个退避分支从逻辑上就不该存在。
内容的提问来源于stack exchange,提问作者Ralf Wickum
相关产品推荐
相关产品推荐

