Kotlin可空类型

103 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第27天,点击查看活动详情

在使用Java语言编码过程中,一不小心就会遇到NullPointerException,Kotlin的诞生就很好地消除了这种异常, 在Kotlin中,类型分为可空类型和⾮空类型,在原有类型后面跟一个?就表示当前类型是可空类型,例如

String?

可空类型经常和安全调用运算符(?.)一起使用

val student: Student? = getStudent()
println(student?.name?.length)

在这种调用的情况下,只要其中一个为null,结果都会输出null,而不是抛出NullPointerException。

如果我们只是需要在某个属性不为空的情况下做些操作,处理使用比较符判断之外,还可以将安全调⽤操作符和let⼀起使⽤

val student: Student? = getStudent()
student?.name?.let {
    println(it)
}

他只有在studentname都不为null的情况下才会输出,和下面代码等价

if(student?.name != null){
    println(student?.name)
}

有时候将一个可空类型传递个一个⾮空类型的时候

val returnNull:Boolean?=getReturnNullValue()
val student: Student? = getStudent(returnNull!!)
fun getStudent(returnNull: Boolean): Student? {
    return if (!returnNull) {
        null
    } else {
        Student("张三")
    }
}

如果我们直接使用,AS就会编译不通过,这个时候我们可以使用?.let然后将结果传递,或者使用⾮空断⾔运算符!!

val student: Student? = getStudent(returnNull!!)

使用!!,可以将任意可空类型转换为非空类型,这个时候代表我们已经明确地告诉编译器,当前对象一定不为null,但是如果当前值为null了,就会直接抛出NullPointerException。

在Java中没有可空变量这一概念,那么如果kotlin调用Java方法,返回值是什么类型呢

public static String getRandomName1(){
    return "name";
}

微信图片_20220428233825.png

此时我们发现返回的类型是String!,它被称为平台类型,表示Kotlin不知道该值是否可以为null,此时虽然我们可以使用.直接操作,但是一旦该值为null,就会抛出NullPointerException。所以一般情况下需要使用@Nullable 或者@NotNull注解表示返回值或者参数的可空性。

@NotNull
public static String getRandomName2(){
    return "name";
}
@Nullable
public static String getRandomName3(){
    return null;
}

这样kotlin在调用的时候就明确地知道当前返回值是可空类型还是非空类型了。