一、概念
在声明变量的时候就要指定它是 Nullable 可空类型还是 Non-Null非空类型。默认为非空类型,即该变量不会为null,为null报错。
二、声明 非空类型 Non-Null
val a :String = "你好"
val b :String = null //赋值为null报错:Null can not be a value of a non-null type String
三、声明 可空类型 Nullable
可空类型不能直接赋值给非空类型,也不能直接调用。
? | 可空类型,变量类型后面加上 ?表示可为null。 |
?. | 安全调用操作符,为null返回null,不为null正常调用。 |
?: | Elvis操作符(空值合并运算符),左侧不为null执行左侧,否则执行右侧。 |
!! | 非空断言操作符,主观认定不会为null的时候使用,为null报错。 |
var a:String = "你好"
val b: String? = null
val c = b //c的类型一样为 String?
a = b //直接赋值报错:Type mismatch: inferred type is String? but String was expected
a = if (b!= null) c else "还行" //一般写法:判断后赋值
a = b ?: "还行" //使用Elvis,左侧不为null执行左侧,为null执行右侧
a = b ?: show()
a = b ?: return
a = b !! //使用 非空断言,主观认定不会为null的时候调用,为null会报错:NullPinterException
println(b.length) //可空类型调用的时候要带上?,否则IDE直接提示错误
println(b?.length) //安全调用,c为null返回null,不为null正常调用。打印:null
四、平台类型 T!
在 Kotlin 中使用不包含可空性信息注释的旧 Java 代码时会出现,意思是 Kotlin 不知道该值是否可以为 null,需要开发者自己做判断。开发者自己不能声明该类型。
Java | Kotlin |
@Nullable T | T? |
@NotNull T | T |
T | T!(可能是 T 或 T?) |
五、与Java混合开发注意点
如果 Java 返回值可能为null,就必须加上@nullable,否则 Kotlin 无法识别,编译器不会提示你需要做判断,就会引发空指针异常。