kotlin学习(二)-可空类型

  据统计,市场上java程序的bug超过50%都是空指针异常,那么kotlin为了改善这个问题,加入了可空类型,在java程序中,变量可以直接赋值为null,但是在kotlin中不能这样

1
2
3
4
fun main(arg: Array<String>) {
var a: Int = null
println(a)
}

以上代码在编译的时候会报错,提示: error: null can not be a value of a non-null type Int
那么如果想要a变量可以赋值为null可以使用可空类型标示符”?”

  • 可空类型

    1
    2
    3
    4
    fun main(arg: Array<String>) {
    var a: Int? = null
    println(a)
    }

    在类型声明后面跟一个?号就可以定义一个可空变量,由可空类型又引出了安全调用符以及Elvis运算符

  • 安全调用符
    如果不使用安全调用符”?”对可空对象进行方法调用,编译会出错

    1
    2
    3
    4
    5
    fun main(arg: Array<String>) {
    var a: String? = null
    var b: Int = a.toInt()
    println(b)
    }

    以上代码编译的时候会报:

    1
    error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?

    第一种解决办法,使用提示建议的非空断言”!!”告诉编译器这个对象不可能为空

    1
    2
    3
    4
    5
    fun main(arg: Array<String>) {
    var a: String? = null
    var b: Int = a!!.toInt()
    println(b)
    }

    但是这样做虽然可以编译通过,但是在执行时仍然会报空指针异常

    1
    Exception in thread "main" kotlin.KotlinNullPointerException

    所以另一种解决办法为使用安全调用符”?”

    1
    2
    3
    4
    5
    fun main(arg: Array<String>) {
    var a: String? = null
    var b: Int? = a?.toInt()
    println(b)
    }

    使用安全调用符的同时需要将接受对象声明为可空类型

  • Elvis运算符
    在上面提到的对可空对象进行操作时,如果操作目标为空值则返回的是null或者空指针异常,那么使用Elvis运算符可以修改为空时返回的值

    1
    2
    3
    4
    5
    fun main(arg: Array<String>) {
    var a: String? = null
    var b: Int? = a?.toInt()?: -1
    println(b)
    }

    使用Elvis运算符后程序打印结果为-1

-------------本文结束感谢您的阅读-------------

本文标题:kotlin学习(二)-可空类型

文章作者:fengxi

发布时间:2019年01月21日 - 15:01

最后更新:2019年04月04日 - 21:04

原始链接:https://super-storm.github.io/2019/01/21/kotlin学习(二)-可空类型/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。