编程Kotlin开发者

解释一下Kotlin中Nullable类型的工作特点。语言中有哪些工具可以安全地处理null值?请提供代码示例并描述最佳实践。

用 Hintsage AI 助手通过面试

答案。

Kotlin通过类型系统实现对null的安全处理:任何类型默认情况下不能是null,例如,val a: String = null会引发编译错误。使用问号?表示可以赋值为null,例如:

val name: String? = null

对于Nullable类型的处理提供了:

  • 安全调用操作符?.,如果对象本身是null则返回null,否则调用方法/字段:name?.length
  • Elvis操作符?:,用于在左侧是null时指定默认值:val length = name?.length ?: 0
  • 通过if/when进行检查:示例:
if (name != null) { println(name.length) }
  • 断言操作符 (!!):强制获取值,当对象为null时引发NullPointerException(非常谨慎使用):
val length = name!!.length

最佳实践:尽量减少Nullable类型,使用安全调用和Elvis操作符,避免使用!!,明确建模允许null的场景。

陷阱问题。

可以给类型val a: String赋值为null吗,如何避免?

回答:不可以,Kotlin中类型默认情况下不能等于null。要允许赋值为null,必须明确指出val a: String? = null。没有?的类型始终是非空的。

由于对主题细微差别缺乏了解而导致的实际错误示例。


故事

在银行应用项目中,类型为User的变量存储客户搜索的结果。开发者定义了var user: User,但有时找不到客户,服务返回null。这导致了NPE和大规模崩溃。


故事

在支持聊天机器人中,使用!!访问用户消息(message!!.text),认为消息总是会到达。机器人在第一个空消息时崩溃。安全调用可以避免这个问题。


故事

在移动应用中,数据库中的数据可能未加载并以null的形式到达。开发者使用直接访问而不是安全访问,这在所有不完整数据的情况下导致崩溃。