kotlinKotlinKotlin编程

Kotlin - 空安全

2017-08-08  本文已影响117人  fish_leong

1.Kotlin空安全介绍

Kotlin空安全可消除来自代码空引用的危险。

2.什么是空引用?

3.Kotlin空安全的使用

在 Kotlin 中,定义变量时可以决定该变量是否可以接受null(空引用)

下面定义一个不接受空引用的变量

    var temp: String = "fish_leong"
    var length=temp.length//因为temp不接受空引用,所以它不会出现NPE,可以放心的各种. . .
    temp = null//会立刻被IDE检测出语法错误
    /***
     * Null can not be a value of a non-null type String,
     * 如果用Java写,IDE不会报错,编译也可以通过,由于代码没有进行空引用判断,最后执行必会抛出NullPointerException
     */
     println(temp.toString())

以上可以看出,写代码的时候难免会有疏漏,而Kotlin在IDE中对空引用进行了检查,避免了运行时出现NPE的情况。

下面定义一个可接受空引用的变量

    var temp: String? = "fish_leong"//定义一个可接受空引用的变量
    val length = temp.length
    /**
     *  对上一行代码的解释
     *  这样IDE语法检查报错"Only safe(?.) or non-null assered (!!.)calls are allowed on a nullable receiver of type String?"
     *  因为temp不是空安全变量,所以不能像上面那样调用,要写成
     *  val length=temp!!.length //!! 操作符
     *  或
     *  val length=temp?.length//? 安全调用
     *  以上这两种写法的区别,在下面代码中会提到
     */
    println("temp的长度length$length")//此行输出"temp的长度length=10"

    // ?. 安全调用示例
    temp = null //temp可接受空引用
    val length2 = temp?.length
    /***
     * 对上一行代码的解释
     * 虽然temp是null,但这里用到了安全调用,
     * 此时temp?.length会返回一个null给length2
     */
    println("temp的长度length2=$length2")//会输出"temp的长度length2=null"

    println(temp?.toString())//此行输出 "null"

    println(temp.toString())//此行输出 "null"
    /**
     * 发现了没,上面这行代码,temp没有用空安全引用,也通过了IDE语法检查,这个在以后的文章再谈
     */
    println(temp!!.toString())//此行抛出"Exception in thread "main" kotlin.KotlinNullPointerException"异常,并终止,所以下面的代码是不能够被执行的

    println(temp.toString())//此行代码是将不会执行(在IDE中,也可以看到这行代码的颜色异常,它是Unreachable code(无法执行到的代码)),因为上一行代码使用了"!!"操作符,而temp又是null,所以抛出NPE终止

4.总结

  1. Kotlin定义变量时,通过给变量的类型后增加?操作符,可以设置该变量是否可以接受空引用(即可赋值为null)。
      var  a:String?=null//可接受空引用
      var  b:String="fish_leong"//不可接受空引用

2.不接受空引用的变量,在IDE中编写代码阶段,IDE通过语法检查帮助我们检查出NPE错误,对该类型的变量也不需要再做null判断,相对减少了不必要的代码,同时也减少了苦逼的debug、打log的排查错误的时间,提高了效率。

3.可接受空引用的变量的两种操作方式

参考文档:
[1]空安全 - Kotlin 语言中文站
[2]Null Safety - Kotlin Programming Language
[3]NullPointerException - 百度百科

上一篇下一篇

猜你喜欢

热点阅读