zoukankan      html  css  js  c++  java
  • 再见NullPointerException。在Kotlin里null的处理(KAD 19)

    作者:Antonio Leiva

    时间:Apr 4, 2017

    原文链接:https://antonioleiva.com/nullity-kotlin/

    关于Kotlin最重要的部分之一:无效处理,我花了很长时间完成写一篇文章。

    东尼·霍尔(Tony Hoare)“空(null)”概念的创作者,自称“十亿美元的错误”。在你编写Java代码是,null是最容易出错的指针。

    如果你在观察Bug管理器,我确信你见到的NullPointerException错误要超过90%

    多亏Kotlin,你将工作在更加安全的环境中(即使是用Java库),它是这些问题尽量减少。

     

    KotlinNull

    除非你设定,Kotlin不存在Null

    也就是说,没有变量缺省值能够被设置成null。记住,在Kotlin中所有类型都是对象。

    因此,不能编译:

    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操作符

    但是,如果我们不希望有一个可以为空变量作为操作结果怎么办?在这种情况下,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,可以用操作符(!!)可以避免null检查。

    以我看,极少有情况需要这个操作符。总是有更好的解决方案。

    但是,你能够这样做:

    1 val x: Int? = null
    2 val y = x!!.toDouble()

    这能够编译,并且产生NullPointerException

    这就是为什么我说:要非常小心使用这个操作符。

      

    Java支持

    当我们使用Java库时,我们可能会发现自己要面对不同的null检查情况。

     

    库恰当的注解

    如果在JavaAndroid中,适当地使用@Nullable@NotNull注解,Kotlin能够与其很好的对接,并且,能够指出变量什么时候是null,什么时候不是

    Android框架的许多部分已经正确的注解了,所以这是与Kotlin配合使用的巨大优势。

    库没有注解

    然而,如果库没有注解,类型将以特殊操作符(单一!)标注,这就意味着这是在我们这边决定一个参数或返回值是否接受null

    如果我们阅读源代码,最好检查代码以决定是否允许使用null

    Android没有注解的例子是RecyclerView支持库。当你创建一个适配器和生成方法时,缺省是为类型加询问。

    但是,如果您查看源代码,会发现在需要覆盖的方法中,没有任何东西能够是null

    结论

    对所有Java开发者,NullPointerException是个噩梦,大多数情况,这表示你的代码发生错误了。

    这在Kotlin中,很容易地将这类错误几乎减少到零,即使使用Java框架和库。

    只有这样,就可避免不必要的长时间的调试工作,而且可以让代码更加稳定。

    如果你要进一步的学习所有这些,且能够流利创建你自己的Android APP,我建议你找这本免费书学习怎样创建你的第一个项目,或直接获取这本书,学习怎样从头开始创建一个完整的APP

     

     

     

     

    ---恢复内容结束---

  • 相关阅读:
    origin 8.5 曲线拟合,延长曲线范围
    赤手空拳编写C#代码
    Vmware 10安装MAC OS X 10.9备忘
    Contest 1445
    Contest 1428
    Contest 1435
    Contest 991
    CSP-SJX2019 解题报告
    【BZOJ4817】【SDOI2017】树点染色
    codeforce 804B Minimum number of steps
  • 原文地址:https://www.cnblogs.com/figozhg/p/6686798.html
Copyright © 2011-2022 走看看