美文网首页
Kotlin空安全

Kotlin空安全

作者: 李庆雪 | 来源:发表于2017-06-22 12:16 被阅读0次
可空类型与非空类型

在 Kotlin 中,类型分为可空引用和非空引用。
例如,String 类型的常规变量不能容纳 null :

var a: String = "abc"
a = null // 如果这样写,就会提示错误,要是在java中运行时才会错误

当然可以声明变量为可空变量,用 String?

var a: String? = "abc"
a = null //此时就不会提示错误了

现在,如果你调用 a 的方法或者访问它的属性
val l = a.length

安全的调用

安全调用操作符?.
a?.length
如果 a 非空,返回 a.length ,否则返回 null ,这个表达式的类型是Int?
如果要只对非空值执行某个操作,安全调用操作符可以与 let 一起使用:

    val listWithNulls: List<String?> = listOf("A", null)
    for (item in listWithNulls) {
        item?.let { println(it) } // 输出 A 并忽略 null
    }
Elvis 操作符

Elvis 操作符?:
val l = b?.length ?: -1
如果?: 左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
请注意,因为 throw 和 return 在 Kotlin 中都是表达式,所以它们也可以用在 elvis 操作符右侧。这可能会非常方便,例如,检查函数参数:

    fun foo(node: Node): String? {
        val parent = node.getParent() ?: return null
        val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ……
    }
!! 操作符

val l = b!!.length
如果 b 为空,就会抛出一个空指针异常.

安全的类型转换

如果对象不是目标类型,那么常规类型转换可能会导致 ClassCastException 。 另一个选择是使用安全的类型转换,如果尝试转换不成功则返回null
val aInt: Int? = a as? Int

可空类型的集合

如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现。

    val nullableList: List<Int?> = listOf(1, 2, null, 4)
    val intList: List<Int> = nullableList.filterNotNull()
    for (item in intList) println(item)

针对空安全可以参考:

// 这里不能通过编译. User对象不能是null
var notNullUser: User= null

// User可以是 null
var user: User? = null

// 无法编译, user可能是null,我们需要进行处理
user.print()

// 只要在user != null时才会打印
user?.print()

// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = user?.name ?: "empty"

/** 
如果user为可空类型,又一定要调用它的成员函数和变量,可以用!!操作符
两种可能,要么正确返回name,要么抛出空指针异常
当user为null,你不想返回null,而是抛出一个空指针异常,你就可以使用它。
*/
var name = user!!.name
总结

定义一个变量之后,分三种情况:

  • 第一:延迟加载,在某个一定能执行的地方进行初始化,否则编译不通过提示:
kotlin.UninitializedPropertyAccessException: lateinit property mPresenter has not been initialized
  • 第二种就是创建变量的时候初始化这样防止了出现 空指针,而且编译也会通过不会出现未初始化情况
  • 第三种就是开始的时候没法初始化只能为null,后期通过判断null来创建对象,通过?.!!.来执行

相关文章

  • Android开发kotlin学习(二)

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

  • Kotlin - 空安全

    1.Kotlin空安全介绍 Kotlin空安全可消除来自代码空引用的危险。 2.什么是空引用? 许多编程语言(包括...

  • Kotlin学习之空安全

    Kotlin学习之空安全 Kotlin相对于Java有许多改良的地方,空安全就是其中的一部分,Kotlin因此解决...

  • 2017-07-18-kotlin Android基础

    kotlin Android基础 1,实现一个基本的数据类 2,空安全: Kotlin,如很多现代的语言,是空安全...

  • Kotlin null 检测机制、空安全、空指针问题

    空安全 Kotlin 引入可空类型、非空类型 Kotlin 的类型系统旨在消除来自代码空引用的危险 许多编程语言(...

  • Kotlin空安全

    可空类型与非空类型 在 Kotlin 中,类型分为可空引用和非空引用。例如,String 类型的常规变量不能容纳 ...

  • Kotlin 空安全

    简介   Kotlin 的类型系统旨在从我们的代码中消除 NullPointerException。减少线上Nul...

  • Kotlin 空安全

    可空类型与非空类型 在 Kotlin 中,类型区分引用可以为 null (可空引用),或不能为 null(非空引用...

  • Kotlin(空安全)

    空安全 可空类型和非空类型 在 Kotlin 类型系统中可以为空和不可为空的引用是不同的。比如,普通的 Strin...

  • Kotlin 空安全

    前言 当我们使用 Java 开发的时候,如果不想遇到 NullPointerException,我们就需要在使用它...

网友评论

      本文标题:Kotlin空安全

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