空安全
- 可空类型和非空类型 ?
// 1、普通的 String 类型的变量不能为空
var a: String ="abc"
// a = null //编译错误 - 直接在 AS 上报错
// 直接调用,不用担心空指针异常
a.length
// 2、? 符号,声明为可空的变量(允许为空)
var b: String? = "abc"
b = null
// b.length b有可能为空,直接调用报错
- 在条件中检查 null
// 3、在条件中检查 b 是否为空
val c = if (b != null) b.length else -1
- 安全调用 ?.
// 4、安全操作符 ?. 如果 b 不为空则返回长度,否则返回空。这个表达式的的类型是 Int?
b?.length
// 5、安全调用在链式调用是很有用的
*?.*?.*?.*
- Elvis 操作符 ?:
// 6、如果 ?: 左边表达式不为空则返回,否则返回右边的表达式。注意右边的表带式只有在左边表达式为空是才会执行
val d = b?.length ?: -1
// 7、注意在 Kotlin 中 throw return 是表达式,所以它们也可以在 Elvis 操作符右边
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
}
- !! 操作符
// 8、返回一个非空的 b 或者抛出一个 b 为空的 NPE
val l = b !!.length
- 安全转换
// 9、普通的转换可能产生 ClassCastException 异常。另一个选择就是使用安全转换,如果不成功就返回空
val aInt: Int? = a as? Int
使用值检查并自动转换
- is !is 表达式
检查一个对象是否是某个特定类型
if (obj is String) {
}
- 智能转换
fun demo(x: Any) {
if (x is String) {
// 做过类型判断以后,obj会被系统自动转换为String类型
print(x.length)
}
}
- 不安全”的转换符
注意 null 不能被转换为 `String` 因为它不是 `nullable`也就是说如果 `y` 是空的,则上面的代码会抛出空异常。
val x: String = y as String
- "安全"转换符
为了避免抛出异常,可以用 as? 这个安全转换符,这样失败就会返回 null
不管 as? 右边的是不是一个非空 String 结果都会转换为可空的。
val x: String ?= y as? String
区间range
操作符形式 .., in 和 !in 与其配合使用
for (i in 1..4) print(i) // 输出“1234”
for (i in 4..1) print(i) // 什么都不输出
if (i in 1..10) { // 等同于 1 <= i && i <= 10
println(i)
}
// 使用 step 指定步长
for (i in 1..4 step 2) print(i) // 输出“13”
for (i in 4 downTo 1 step 2) print(i) // 输出“42”
// 使用 until 函数排除结束元素
for (i in 1 until 10) { // i in [1, 10) 排除了 10
println(i)
}
网友评论