美文网首页Android开发经验谈Android开发程序员
Kotlin空指针安全(null-safety)笔记

Kotlin空指针安全(null-safety)笔记

作者: dengyin2000 | 来源:发表于2018-02-19 22:55 被阅读349次

Kotlin语言基础笔记

Kotlin流程控制语句笔记

Kotlin操作符重载与中缀表示法笔记

Kotlin扩展函数和扩展属性笔记

Kotlin空指针安全(null-safety)笔记

Kotlin类型系统笔记

Kotlin面向对象编程笔记

Kotlin委托(Delegation)笔记

Kotlin泛型型笔记

Kotlin函数式编程笔记

Kotlin与Java互操作笔记

Kotlin协程笔记

多年的java开发经验总结得出,至少50%以上的线上bug都是NPE(NullPointException)引起的。在java代码中充斥着大量的非空判断,如果是有多层的对象,比如person.getAddress().getCity(),你需要判断person非空,然后判断address非空,只有两个都非空时,才能安全的获取到city。这样的代码非常冗余和恶心。

现在我们来看看Kotlin做了那些事情让我们来避免NPE错误。

1. 可为null类型

在Kotlin中通常我们直接定义的类型是不可为null的,如下:

data class Person(val name:String)

fun main(args: Array<String>) {
    var s = "abc"
    s = null  //编译错误:null can not be a value of a non-null type String

    var i = 1
    i = null  //编译错误:null can not be a value of a non-null type Int

    var p = Person("Denny")
    p = null  //编译错误:null can not be a value of a non-null type Person
}

如果要允许为null,我们需要在变量的类型后面加个?号。如下:

data class Person(val name:String)

fun main(args: Array<String>) {
    var s: String? = "abc"
    s = null

    var i:Int? = 1
    i = null

    var p:Person? = Person("Denny")
    p = null

    var list:MutableList<Int>? = mutableListOf(1, 2, 3)
    list = null
}

2. 安全调用

上面的例子中,如果调用s.length的话,这将是不安全的,编译器直接报错。

npe
编译器已经告诉你了要使用安全调用(?.)或者非空断言调用(!!.)才被允许在String?类型上。
fun main(args: Array<String>) {
    var s: String? = "abc"
    s = null
    println(s?.length)  //打印null
    println(s!!.length)  //抛出Exception in thread "main" kotlin.KotlinNullPointerException异常
}

另外我们再看看下面这段有趣的代码:

fun main(args: Array<String>) {
    var s: String? = "abc"
    println(s is Any)    //打印true
    println(s is Any?)   //打印true
    s = null
    println(s is Any)   //打印false
    println(s is Any?)  //打印true
}

安全调用在链式调用上非常有用,比如上面java代码person.getAddress().getCity(),在Kotlin中使用安全调用的话就是person?.getAddress()?.getCity()。只要person或者address有一个为null的话,整个表达式就返回null。比java中用2个if来判断非空好多了。
如果对某个非空值执行某个操作,安全调用操作符可以和let一起使用。比如:

fun main(args: Array<String>) {
    val list = listOf("a", "b", null)
    println(list) 

    list.forEach { it?.let { println(it) } }
}

输出

[a, b, null]
a
b

最后你还可以使用Elvis错作符,之前的文章有说过。

fun main(args: Array<String>) {
    var name:String? = null
    name = name?:"Unknown"
    println(name)   //打印Unknown
}

相关文章

  • Kotlin空指针安全(null-safety)笔记

    Kotlin语言基础笔记 Kotlin流程控制语句笔记 Kotlin操作符重载与中缀表示法笔记 Kotlin扩展函...

  • 一,为什么学习kotlin?

    空类型安全空安全特性让kotlin移除了实时出现的空指针异常的风险 Lambda表达式 扩展方法 类型推导类型推断...

  • Kotlin基础认识 (5)可空数据类型

    一、可空类型概念 Kotlin的非空类型设计能够有效防止空指针异常。 定义可空类型 二、使用安全调用运算符 (?....

  • 从 Java 到 Kotlin,再从 Kotlin 回归 Jav

    前言 Kotlin 很流行,Kotlin 很时髦。Kotlin 为你提供了编译时 null-safety 和更少的...

  • 从 Java 到 Kotlin,再从 Kotlin 回归 Jav

    前言 Kotlin 很流行,Kotlin 很时髦。Kotlin 为你提供了编译时 null-safety 和更少的...

  • Kotlin入门指南

    Kotlin的优势 代码简洁高效、强大的when语法,不用写分号结尾,findViewById光荣退休,空指针安全...

  • Kotlin笔记 空指针检查

    Kotlin相较于java的一大优势就是可以减少空指针的出现,变量的type需要指定是否能为空,不带?的type不...

  • Android开发kotlin学习(二)

    1.kotlin的空安全 为啥子说kotlin是空安全的?和Java相比,kotlin的空安全可以带来哪些便利之处...

  • Kotlin 空指针

    针对空指针问题, Kotlin有专门的针对语法以避免问题。 可空类型 默认声明的变量是不能为 null 的,如果要...

  • Kotlin-空指针检查

    Kotlin搞空指针检查现象:java存在问题,大量的崩溃是空指针异常。原因:java的空指针异常是一种运行时异常...

网友评论

    本文标题:Kotlin空指针安全(null-safety)笔记

    本文链接:https://www.haomeiwen.com/subject/pzjwtftx.html