面试题答案
一键面试区别
- 空值处理:
- 非空类型(如
String
):表示该类型的变量不能为null
。如果尝试将null
赋值给非空类型变量,会在编译时报错。例如:
val nonNullStr: String = null // 编译错误,不能将null赋值给非空类型String
- 可空类型(如
String?
):表示该类型的变量可以为null
。可以将null
赋值给可空类型变量。例如:
val nullableStr: String? = null // 合法,可空类型可以赋值为null
- 非空类型(如
- 操作限制:
- 非空类型:由于其不能为
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
- 非空类型:由于其不能为
实际编程场景
- 非空类型的场景:
- 数据库查询确定有值的情况:当从数据库查询一个必定存在的字段时,比如用户表中已确认不为空的用户名字段。假设数据库表结构设计保证
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 }
- 数据库查询确定有值的情况:当从数据库查询一个必定存在的字段时,比如用户表中已确认不为空的用户名字段。假设数据库表结构设计保证
- 可空类型的场景:
- 用户输入可能为空的情况:获取用户输入的邮箱地址,用户可能未填写。
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")) }