MST

星途 面试题库

面试题:Kotlin 数据类型之可空类型与非空类型区别

在 Kotlin 中,简述可空类型与非空类型的定义及使用场景,并举例说明如何在代码中安全地处理可空类型数据。
24.1万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

可空类型与非空类型的定义

  • 非空类型:在 Kotlin 中,默认情况下声明的变量为非空类型,即该变量不能赋值为 null。例如:
val nonNullable: String = "Hello"
// nonNullable = null // 这行代码会报错,因为 nonNullable 是不可为空的
  • 可空类型:当变量可能为 null 时,需要在类型后面加上 ? 来声明为可空类型。例如:
var nullable: String? = "World"
nullable = null // 这是允许的,因为 nullable 是可空类型

使用场景

  • 非空类型:适用于变量在任何情况下都不会为 null 的场景,这样可以避免空指针异常,提高代码的安全性和稳定性。比如一个表示人的姓名的变量,正常情况下姓名不能为空。
  • 可空类型:适用于变量可能为空的场景,例如从数据库查询数据时,某些字段可能没有值,此时用可空类型来表示这些可能为空的数据比较合适。

安全处理可空类型数据的方法

  1. 安全调用操作符(?.):如果对象可能为空,使用安全调用操作符调用对象的方法或访问属性时,如果对象为 null,不会抛出空指针异常,而是返回 null
val nullableStr: String? = null
val length = nullableStr?.length // length 为 null
  1. Elvis 操作符(?:):用于提供一个默认值,当可空对象为 null 时使用默认值。
val nullableStr: String? = null
val result = nullableStr?.length?: 0 // 当 nullableStr 为 null 时,result 为 0
  1. 非空断言操作符(!!):使用 !! 操作符将可空类型转换为非空类型,但如果对象实际为 null,会抛出 NullPointerException。应谨慎使用。
val nullableStr: String? = null
// val length = nullableStr!!.length // 这里会抛出 NullPointerException
  1. let 函数:结合安全调用操作符使用,在对象不为 null 时执行代码块。
val nullableStr: String? = "test"
nullableStr?.let {
    val length = it.length
    println("Length is $length")
}