kotlin空安全

简介

此文档记做Kotlin开发过程中遇到的问题以及总结

空安全

可空对象

Kotlin与Java不同,对象分为可空和不可空,可空在类型声明后加 ?

var b : String?

若类型为不可空,此时赋空编译器则会报错。

var b : String = "1"
b = null  // 编译不通过

安全的类型转换

Java在类型转换时,如果类型不匹配则会出现类型强转异常ClassCastException导致Crash;而Kotlin则可以采取安全的类型转换。

// 若a的类型不为Int则返回null,不会导致crash
val aInt: Int? = a as? Int 

安全的调用

在使用可能为空的对象时,Java中若不进行空判断则非常容易产生空指针异常,所以经常会出现下面的代码。

if (不为空) { } else { }

而Kotlin中可以采用安全的调用方式。

// 如果 b 非空,就返回 b.length;否则返回 null
val bLength: Int? = b?.length 

若想对非空值执行某个操作,安全调用操作符可以与 let 一起使用。

bLength?.let{
    // 具体逻辑
}
// 只有bLength不为空时才会执行lambda表达式

Elvis操作符

当我们有一个可空的引用 b 时,我们可以说 如果 b 非空,我使用它;否则使用某个非空的值 x

val bLength: Int = if (b != null) b.length else -1

除了采用if的方式还可以使用elvis操作符?:,与Java中的三目表达式类似:

// 如果 ?: 左侧表达式非空,elvis 操作符就调用其左侧表达式,否则调用右侧表达式。
val bLength = b?.length ?: -1

!! 操作符

若想抛出空指针异常NPE

// 若b为空则抛出空指针异常
val bLength = b!!.length