MST

星途 面试题库

面试题:Kotlin空安全机制中可空类型与非空类型的区别及使用场景

请阐述在Kotlin中可空类型(如String?)和非空类型(如String)的具体区别,并且举例说明在哪些实际编程场景下会分别使用到它们。
32.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 空值处理
    • 非空类型(如String:表示该类型的变量不能为null。如果尝试将null赋值给非空类型变量,会在编译时报错。例如:
    val nonNullStr: String = null // 编译错误,不能将null赋值给非空类型String
    
    • 可空类型(如String?:表示该类型的变量可以为null。可以将null赋值给可空类型变量。例如:
    val nullableStr: String? = null // 合法,可空类型可以赋值为null
    
  2. 操作限制
    • 非空类型:由于其不能为null,在使用时可以直接调用其方法和属性,无需额外的空值检查。例如:
    val nonNullStr: String = "Hello"
    val length = nonNullStr.length // 直接调用length属性获取字符串长度
    
    • 可空类型:由于其可能为null,在调用其方法和属性前必须进行空值检查,否则会导致运行时错误(NullPointerException)。Kotlin提供了安全调用操作符(?.)、非空断言操作符(!!)等方式来处理。例如:
    val nullableStr: String? = null
    val length1 = nullableStr?.length // 使用安全调用操作符,若nullableStr为null,length1为null
    val length2 = nullableStr!!.length // 使用非空断言操作符,若nullableStr为null,抛出NullPointerException
    

实际编程场景

  1. 非空类型的场景
    • 数据库查询确定有值的情况:当从数据库查询一个必定存在的字段时,比如用户表中已确认不为空的用户名字段。假设数据库表结构设计保证username字段非空。
    data class User(val username: String, val age: Int)
    fun getUserFromDB(): User {
        // 从数据库查询用户数据,这里假设查询逻辑已实现
        val result = queryFromDB()
        return User(result.getString("username"), result.getInt("age"))
    }
    
    • 函数参数或返回值明确不能为空:比如一个计算两个整数和的函数,其参数必然是有效的整数。
    fun add(a: Int, b: Int): Int {
        return a + b
    }
    
  2. 可空类型的场景
    • 用户输入可能为空的情况:获取用户输入的邮箱地址,用户可能未填写。
    fun getEmailFromUser(): String? {
        print("请输入邮箱地址:")
        val input = readLine()
        return if (input.isNullOrBlank()) null else input
    }
    
    • 第三方API返回值可能为空:调用一个获取天气信息的API,某些情况下可能因为网络问题等原因未能获取到天气描述。
    data class Weather(val description: String?)
    fun getWeather(): Weather {
        // 调用第三方API获取天气数据,这里假设API调用逻辑已实现
        val apiResult = callWeatherAPI()
        return Weather(apiResult.getString("description"))
    }