天天看点

Kotlin学习2.10:空值处理可空类型变量(?)安全调用符(?.)Elvis操作符(?:)非空断言(!!.)

Kotlin学习2.10:空值处理

  • 可空类型变量(?)
  • 安全调用符(?.)
  • Elvis操作符(?:)
  • 非空断言(!!.)

在程序开发过程中,经常会遇到空指针异常的问题,如果对这个问题处理不当还可能会引起程序的崩溃, 因此在Kotlin中,为了避免出现空指针异常的问题。引入了Null机制。

可空类型变量(?)

Kotlin变量分成两种类型,一种是可空类型的变量,一种是非空类型的变量。

一般情况下,一个变量默认是非空类型。

当某个变量的值可以为空时,必须在说明处的数据类型后添加 “?” 来标示该引用可为空。

var name:String		//	声明非空变量
var age:Int?		//	声明可空变量
           

接下来通过一段代码来学习如何判断变量是否为空,以及如何使用可空变量:

fun main(args:Array<String>) {
    var name:String	= "Tom"	    //	声明非空变量
    var age:String? = null		//	声明可空变量
    if (age != null){
        println(age.length)
    }else{
        age = "18"
        println(age)
    }
}
           
Kotlin学习2.10:空值处理可空类型变量(?)安全调用符(?.)Elvis操作符(?:)非空断言(!!.)

安全调用符(?.)

上一小节,可空变量在使用时需要通过语句进行判断,然后再进行相应的操作,这样的使用方法还是比较复杂。

为此Kotlin提供了一个安全调用符 “?.” ,专门用于调用可空类型变量中的成员方法或属性,其语法格式为 “变量?.成员” 。

其作用是判断变量是否为null,如果不为null才调用变量的成员方法或者属性。

代码如下:

fun main(args:Array<String>) {
    var name:String	= "Tom"	    
    var age:String? = null		
    var result = age?.length
    println(result)
}
           
Kotlin学习2.10:空值处理可空类型变量(?)安全调用符(?.)Elvis操作符(?:)非空断言(!!.)

Elvis操作符(?:)

在使用安全调用符调用可控变量中的成员方法或属性时,如果当前变量为空,则会返回一个null值,但有时即使当前变量为null,也不想返回一个null值而是指定一个默认值,此时该如何处理呢?

为了解决这样的问题,Kotlin提供了一个Elvis操作符(?:),通过Elvis操作符(?:)可以指定可空变量为null时,调用该变量中的成员方法或属性的返回值。其语法格式为“表达式?.表达式”。

如果左侧表达式非空,则返回左侧表达式的值。否则返回右侧表达式的值。

当且仅当左侧为空时,才会对右侧表达式求值。

代码如下:

fun main(args:Array<String>) {
    var name:String	= "Tom"
    var age:String? = null
    var result = age?.length ?: "18"
    println(result)
}
           
Kotlin学习2.10:空值处理可空类型变量(?)安全调用符(?.)Elvis操作符(?:)非空断言(!!.)

非空断言(!!.)

除了通过使用安全调用符(?.)来使用可控类型的变量之外,还可以通过非空断言(!!.)来调用可空类型变量的成员方法或属性。

使用非空断言时。调用变量成员方法或属性的语法结构为“变量!!.成员”。

非空断言会将任何变量(可空类型变量或者非空类型变量)转换为非空类型的变量,若该变量为空则抛出异常。

代码如下:

fun main(args:Array<String>) {
    var age:String? = null
    var result = age!!.length
    println(result)
}
           
Kotlin学习2.10:空值处理可空类型变量(?)安全调用符(?.)Elvis操作符(?:)非空断言(!!.)

从运行结果可以看出,程序抛出了空指针异常,如果变量age赋值不为空,则程序可以正常运行。

博客为个人收集学习,供大家交流学习。

参考书籍:《Kotlin从基础到实践》