NULL检查机制
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理
//类型后面加?表示可为空
var age: String? = "23"
//抛出空指针异常
val ages = age!!.toInt()
//不做处理返回 null
val ages1 = age?.toInt()
//age为空返回-1
val ages2 = age?.toInt() ?: -1
当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null。
当 str 中的字符串内容不是一个整数时, 返回 null:
fun parseInt(str: String): Int? {
// ...
}
以下实例演示如何使用一个返回值可为 null 的函数:
fun main(args: Array<String>) {
if (args.size < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// 直接使用 `x * y` 会导致错误, 因为它们可能为 null.
if (x != null && y != null) {
// 在进行过 null 值检查之后, x 和 y 的类型会被自动转换为非 null 变量
print(x * y)
}
}
?和!!的区别
? 表示当前对象是否可以为空
!! 表示当前对象不为空的情况下执行
当然上面这两句话可能比较难理解 下面做下简单的分析
"?"加在变量名后,系统在任何情况不会报它的空指针异常。
"!!"加在变量名后,如果对象为null,那么系统一定会报异常!
ArrayList<String> myList = null; // 创建一个null的队列
这段代码在执行的时候没有初始化会报空指针异常 这肯定毋庸置疑
在kotlin中 会这样写 ,在调用myList的时候在它后面加上一个问号myList?.size()
,当myList为null的时候直接会打印List Size = null
并不会有null异常出现。
但是 当你如果使用编译器自动转化的时候会自动加上!!
这是因为编译器在转化时为了保证代码转化前后的一致性所造成的。换句话说,在Java上出异常的,转化到KT上,编译器任然会让他保持抛出异常,NullPointerException也是如此。
所以可以看出,!!加上去后好像并没有和之前Java代码有什么区别嘛,该null的地方任然会抛出异常。所以大多数情况下都会使用?来检测null,轮不到!!出场。!!只会在你需要对某对象进行非空判断,并且需要抛出异常时才会使用到。
那么什么时候可以使用 ?
1在声明对象时,把它跟在类名后面,表示这个类允许为null;
2在调用对象时,把它跟在对象后面,表示如果为null程序就会视而不见。
总之 !!目的是明确区分“可空”与“不可空”。在kotlin中使用的更多的还是?