Kotlin学习笔记-空类型、空安全、非空断言、类型转换等特性总结

一、可空类型、空安全

1.1、定义一个可空类型的变量

定义一个可空类型的变量的格式为:修饰符 变量名 : 类型? = 值

1.2、判断可空类型的两种使用方式

1.2.1、if...else...判断

1.2.2、使用符号?.判断

  • 该符号的用法为:可空类型变量?.属性/方法。如果可空类型变量为null时,返回null
  • 这种用法大量用于链式操作的用法中,能有效避免空引用异常(NullPointException),因为只要链式其中的一个为null,则整个表达式都为null
var str : String? = "123456"
str = null
println(str?.length)   // 当变量str为null时,会返回空(null)
//输出结果:
null

1.2.3、链式调用

val testStr : String? = null
val result = testStr?.length?.plus(5)?.minus(10)
println(result)
//输出结果为null

1.2.4、函数中使用可空类型的情况下

当一个函数/方法有返回值时,如果方法中的代码使用?.去返回一个值,那么方法的返回值的类型后面也要加上?符号

fun funNullMethod() : Int? {
    val str : String? = "123456"
    return str?.length
}

1.2.5、let操作符

  • let操作符的作用:当使用符号?.验证的时候忽略掉null
  • let的用法:变量?.let{ ... }

例:排除掉数组中的空元素

val arrTest : Array = arrayOf(1,2,null,3,null,5,6,null)

// 传统写法
for (index in arrTest) {
    if (index == null){
        continue
    }
    println("index => $index")
}

// let写法
for (index in arrTest) {
    index?.let { println("index => $it") }
}

输出结果

index => 1
index => 2
index => 3
index => 5
index => 6

二、Evils操作符

Evils其实不是一个操作符,而是evil的复数,而evil的意思在这里可以理解为屏蔽、安全的操作符,这样的操作符有三种:
1、?: 这个操作符表示在判断一个可空类型时,会返回一个我们自己设定好的默认值.
2、!! 这个操作符表示在判断一个可空类型时,会显示的抛出空引用异常(NullPointException).
3、as? 这个操作符表示为安全的类型转换.

2.1、?:操作符

当我们定义了一个可空类型的变量时,如果该变量不为空,则使用,反之使用另外一个不为空的值

val testStr : String? = null

var length = 0

// 例: 当testStr不为空时,输出其长度,反之输出-1

// 传统写法
length = if (testStr != null) testStr.length else -1

// ?: 写法
length = testStr?.length ?: -1

println(length)
//输出结果 -1

分析:此操作符一般和?.操作符连用。当且仅当?:左边的表达式为null时,才会执行?:右边的表达式。

2.2、!!操作符

!!操作符可谓是给爱好空引用异常(NullPointException)的开发者使用,因为在使用一个可空类型变量时,在该变量后面加上!!操作符,会显示的抛出NullPointException异常

val testStr : String? = null
println(testStr!!.length)//直接报空指针异常

2.3、as?操作符

其实这里是指as操作符,表示类型转换,如果不能正常转换的情况下使用as?操作符。当使用as操作符的使用不能正常的转换的情况下会抛出类型转换(ClassCastException)异常,而使用as?操作符则会返回null,但是不会抛出异常

// 会抛出ClassCastException异常
val num1 : Int? = "Koltin" as Int
println("nun1 = $num1") // 会报ClassCastException异常

val num2 : Int? = "Koltin" as? Int
println("nun2 = $num2) // 输出结果为null

总结

  • 项目中会抛出空引用(NullPointerException)异常的情况

在可空类型变量的使用时,用了!!操作符
显式抛出空引用异常 throw NullPointerException()
外部 Java 代码导致的
对于初始化,有一些数据不一致(如一个未初始化的 this 用于构造函数的某个地方)

  • 项目中会抛出类型转换(ClassCastException)异常的情况

在类型转换中使用了as操作符
使用了toXXX()方法不能转换的情况下
外部 Java 代码导致的

  • 尽量避免使用的操作符

尽可能的不要使用!!操作符,多使用?:、?.操作符,以及let{}函数
尽可能的使用as?操作符去替换掉as,在不确定是否可以安全转换的情况下不使用toXXX()方法

你可能感兴趣的:(Kotlin学习笔记-空类型、空安全、非空断言、类型转换等特性总结)