前言

如果你之前使用过Java,一定被一个问题折磨无数次:NullPointerException——空指针异常。

在Java中,空指针式程序崩溃、线上Bug、闪退的第一大元凶。我们写了无数的if(obj != null)判断,代码臃肿、重复,但即便如此也很难100%规避空指针。

而空安全,正式Kotlin最核心的标志性特性。

一、Kotlin核心规则:默认非空,可空需手动开启。

1、非空类型

Kotlin中,普通类型默认不允许为null:

// 非空类型:绝对不能赋值 null
var name: String = "Kotlin"
name = null // 编译直接报错!

这也是Kotlin解决NPE的根本:不能空的变量,编译器直接禁止赋值null。

2、可空标志

如果业务确实需要空值,必须手动加?,显示声明->我可以为null

// 可空类型:String? 允许 null
var name: String? = "Kotlin"
name = null // 合法

3、可空类型不能直接调用方法/属性

Kotlin不允许对可空类型直接调用方法,杜绝一切潜在NPE。

var name: String? = null
name.length // 编译报错!不允许直接调用

二、Kotlin四大安全解决方案

1、安全调用 ?.

规则:不为null就调用,为null直接返回null,不报错。

val name: String? = null
val len = name?.length 

2、Elvis表达式 ?:空值兜底

规则:为空取默认值,不为空取原值

val name: String? = null
val realName = name ?: "默认用户名"
// 为空 -> 取后者

日常高频组合:安全调用+Elvis

val length = name?.length ?: 0

3、非空

规则:强制把可空类型转为非空,告诉编辑器:我保证它一定不为空

val name: String? = null
name!!.length // 编译通过,运行直接 NPE

忠告:能不用就不用!

!! 的本质是:放弃 Kotlin 空安全,退回 Java 模式。

4、智能类型推导

Kotlin编译器及其聪明,只要你做了if判空,自动智能类型转换,可空类型自动变成非空类型。

val name: String? = "abc"
if(name != null){
    // 自动识别:此处 name 一定非空
    println(name.length) 
}

三、总结

Kotlin之所以能成为安卓官方首选语言、替代Java,空安全是最大底气。

掌握空值体系,你就彻底告别了Java时代无休止的空指针bug,写出更健壮、更简洁、更安全的现代化代码。

更多推荐