Kotlin for Android(六)

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
    13
    val 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
    2
    val myString = a?.toString() ?: return false
    val myString = a?.toString() ?: throw IllegalStateException()
  • 我们确定我们是在用一个非null变量,但是他的类型却是可null的。我们可以使用 !!操作符来强制编译器执行可null类型时跳过限制检查,此时确定了不为null,直接定义为非null对象

    1
    2
    val a: Int? = null
    a!!.toString() throw KotlinNullPointerException

可null性和Java库

  • Java中在一些获取对象的方法在Kotlin中显示返回 Any!这表示让开发者自己决定是否这个变量是否可null

    1
    2
    3
    4
    5
    6
    public class NullTest {
    @Nullable
    public Object getObject(){
    return "";
    }
    }
  • 编译不通过

  • 比如重写 Activity 的 onCraete 函数,我们可以决定是否让 savedInstanceState 可null,都会被编译,但是第二种是错误的,因为一个Activity很可能接收到一个null的bundle
    1
    2
    3
    4
    override fun onCreate(savedInstanceState: Bundle?) {
    }
    override fun onCreate(savedInstanceState: Bundle) {
    }
willkernel wechat
关注微信公众号
帅哥美女们,请赐予我力量吧!