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提供了一个安全调用符 “?.” ,专门用于调用可空类型变量中的成员方法或属性,其语法格式为 “变量?.成员” 。
其作用是判断变量是否为null,如果不为null才调用变量的成员方法或者属性。
代码如下:
fun main(args:Array<String>) {
var name:String = "Tom"
var age:String? = null
var result = age?.length
println(result)
}
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)
}
非空断言(!!.)
除了通过使用安全调用符(?.)来使用可控类型的变量之外,还可以通过非空断言(!!.)来调用可空类型变量的成员方法或属性。
使用非空断言时。调用变量成员方法或属性的语法结构为“变量!!.成员”。
非空断言会将任何变量(可空类型变量或者非空类型变量)转换为非空类型的变量,若该变量为空则抛出异常。
代码如下:
fun main(args:Array<String>) {
var age:String? = null
var result = age!!.length
println(result)
}
从运行结果可以看出,程序抛出了空指针异常,如果变量age赋值不为空,则程序可以正常运行。
博客为个人收集学习,供大家交流学习。
参考书籍:《Kotlin从基础到实践》