Kotlin中的可空类型

2019-08-17 13:26:04 浏览数 (1)

Java的NullPointException是经常遇到的异常,也是最让人头疼的一个异常。Kotlin为了解决这个问题,引进了可空类型,将运行时可能发生异常提前到编译期发现。 Kotlin中有可空类型,这种类型表示取值可能为空;而一般类型,则取值不能为空。区别是类型后面有一个?,表示这个类型是可空的。 举个栗子:

代码语言:javascript复制
var s?=null
var s="Hello World"
var s=null //编译器提示错误,因为s1是不可空的类型

为了应对可空的判断,Kotlin提供了几种操作符。

在Java里,一段代码可能如下:

代码语言:javascript复制
int length(String s){
    if(s==null){
        return 0;
    }else{
        return s.length();
    }
}

而在Kotlin中,这段代码就是下面这个样子的:

代码语言:javascript复制
fun length(s: String?):Int?{
    return s?.length
}

当对一个可空的类型使用?.等价于

代码语言:javascript复制
if(s==null){
    return null
}else{
    return s.length
}

这样得到的结果就是Int?,结果也是一个可能为空的类型。?.的返回类型需要注意,是一个可空类型

?:

Java中的三目运算符?:的使用如下:

代码语言:javascript复制
int length(String s){
    return s==null?-1:s.length();
}

Kotlin中也有?:运算符,使用情况类型,

代码语言:javascript复制
fun length(s:String?):Int{
    return s?.length ?: -1
}

?:操作符等价于下面这段代码:

代码语言:javascript复制
if(s?length==null) {
    return -1;
}else{
    return s?.length
}

可以发现?:其实就是Java中的三目运算符。

!!

如果在某种情况下,明确能知道一个可空类型不可能为空,那么可以使用!!进行说明,比如:

代码语言:javascript复制
fun length(s:String):Int{
    return s!!.length
}

因为你自己确保了这个可空类型不为空,那么如果为空,那不好意思了,你就会碰到空指针异常了,Exception in thread "main" kotlin.KotlinNullPointerException 。 所以说,Kotlin中虽然有了可空类型,但也不是就没有空指针异常哦。

0 人点赞