Kotlin通过类型系统实现对null的安全处理:任何类型默认情况下不能是null,例如,val a: String = null会引发编译错误。使用问号?表示可以赋值为null,例如:
val name: String? = null
对于Nullable类型的处理提供了:
?.,如果对象本身是null则返回null,否则调用方法/字段:name?.length。?:,用于在左侧是null时指定默认值:val length = name?.length ?: 0if (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的形式到达。开发者使用直接访问而不是安全访问,这在所有不完整数据的情况下导致崩溃。