一起养成写作习惯!这是我参与「掘金日新计划 · 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)
}
他只有在student
和name
都不为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";
}
此时我们发现返回的类型是String!
,它被称为平台类型,表示Kotlin不知道该值是否可以为null,此时虽然我们可以使用.
直接操作,但是一旦该值为null,就会抛出NullPointerException。所以一般情况下需要使用@Nullable
或者@NotNull
注解表示返回值或者参数的可空性。
@NotNull
public static String getRandomName2(){
return "name";
}
@Nullable
public static String getRandomName3(){
return null;
}
这样kotlin在调用的时候就明确地知道当前返回值是可空类型还是非空类型了。