Kotlin中的null安全
在Kotlin中一切都是对象(甚至是Java中原始数据类型),一切都是可null的。所以,当然我们可以有一个可null的integer,检查了一个对象的可null性,之后这个对象就会自动转型成不可null类型,这就是Kotlin编译器的智能转换,在 if 中, a 从 Int? 变成了 Int ,所以我们可以不需要再检查可null性而直接使用它,if 代码之外,又得检查处理,仅仅在变量当前不能被改变的时候才有效val 属性或者本地( val or var )变量,因为这个value可能被另外的线程修改,这时前面的检查会返回false
1
2
3
4
5
6
7
8
9
10
11
12
13val a:Int?=null
...
if(a!=null){
a.toString()
}
简化代码
val a: Int? = null
...
a?.toString()
val a:Int? = null
val myString = a?.toString() ?: ""throw 和 return 都是表达式
1
2val myString = a?.toString() ?: return false
val myString = a?.toString() ?: throw IllegalStateException()我们确定我们是在用一个非null变量,但是他的类型却是可null的。我们可以使用
!!
操作符来强制编译器执行可null类型时跳过限制检查,此时确定了不为null,直接定义为非null对象1
2val a: Int? = null
a!!.toString() throw KotlinNullPointerException
可null性和Java库
Java中在一些获取对象的方法在Kotlin中显示返回
Any!
这表示让开发者自己决定是否这个变量是否可null1
2
3
4
5
6public class NullTest {
@Nullable
public Object getObject(){
return "";
}
}编译不通过
- 比如重写 Activity 的 onCraete 函数,我们可以决定是否让 savedInstanceState 可null,都会被编译,但是第二种是错误的,因为一个Activity很可能接收到一个null的bundle
1
2
3
4override fun onCreate(savedInstanceState: Bundle?) {
}
override fun onCreate(savedInstanceState: Bundle) {
}