做者:Antonio Leivaandroid
时间:Apr 4, 2017安全
原文连接:https://antonioleiva.com/nullity-kotlin/框架
关于Kotlin最重要的部分之一:无效处理,我花了很长时间完成写一篇文章。ide
东尼·霍尔(Tony Hoare)“空(null)”概念的创做者,自称“十亿美圆的错误”。在你编写Java代码是,null是最容易出错的指针。学习
若是你在观察Bug管理器,我确信你见到的NullPointerException错误要超过90%。ui
多亏Kotlin,你将工做在更加安全的环境中(即便是用Java库),它是这些问题尽可能减小。spa
除非你设定,Kotlin不存在Null。指针
也就是说,没有变量缺省值可以被设置成null。记住,在Kotlin中全部类型都是对象。调试
所以,不能编译:code
1 val x: Int = null
若是要变量接受Null,你必须为类型加上问号(?):
1 val x: Int? = null
然而,从这点来讲,编译器强制你在对该变量作任何事情以前检查变量是否为null。这确保NullPointerException不会发生。
例如:
1 val y = x.toDouble()
若是你不先检查是否为null,则不能编译,必须这样:
1 if (x != null) { 2 val y = x.toDouble() 3 }
有一个更容易的方法表示前面的例子,在调用方法时,在“.”以前加个问号(?)。
若是变量不是null,它将执行操做。不然,它不作任何事情:
1 val y = x?.toDouble()
在这种状况下,若是 x 是 null,那么表达式将返回null。因此,y将是Double?类型。
可是,若是咱们不但愿有一个能够为空变量做为操做结果怎么办?在这种状况下,Elvis操做符容许咱们返回一个值:
1 val y = x?.toDouble() ?: 0.0
这行代码等效:
1 val y = if (x != null) { 2 x.toDouble() 3 } else { 4 0.0 5 }
注意:
如你所见,Kotlin中大多数语句都转化为表达式。例如,你可以将if的结果赋值给变量。
若是你确信变量不可能为null,能够用操做符(!!)能够避免null检查。
以我看,极少有状况须要这个操做符。老是有更好的解决方案。
可是,你可以这样作:
1 val x: Int? = null 2 val y = x!!.toDouble()
这可以编译,而且产生NullPointerException。
这就是为何我说:要很是当心使用这个操做符。
当咱们使用Java库时,咱们可能会发现本身要面对不一样的null检查状况。
若是在Java和Android中,适当地使用@Nullable和@NotNull注解,Kotlin可以与其很好的对接,而且,可以指出变量何时是null,何时不是。
Android框架的许多部分已经正确的注解了,因此这是与Kotlin配合使用的巨大优点。
然而,若是库没有注解,类型将以特殊操做符(单一!)标注,这就意味着这是在咱们这边决定一个参数或返回值是否接受null。
若是咱们阅读源代码,最好检查代码以决定是否容许使用null。
Android没有注解的例子是RecyclerView支持库。当你建立一个适配器和生成方法时,缺省是为类型加询问。
可是,若是您查看源代码,会发如今须要覆盖的方法中,没有任何东西可以是null。
对全部Java开发者,NullPointerException是个噩梦,大多数状况,这表示你的代码发生错误了。
这在Kotlin中,很容易地将这类错误几乎减小到零,即便使用Java框架和库。
只有这样,就可避免没必要要的长时间的调试工做,并且可让代码更加稳定。
若是你要进一步的学习全部这些,且可以流利建立你本身的Android APP,我建议你找这本免费书学习怎样建立你的第一个项目,或直接获取这本书,学习怎样从头开始建立一个完整的APP。
---恢复内容结束---