- 概述
- Kotlin的空安全是其语言的一个重要特性。它旨在在编译时期就尽可能地避免空指针异常(NullPointerException),这是在许多编程语言(如Java)中常见且难以调试的问题。在Kotlin中,类型系统可以区分一个变量是可以为null的还是不可以为null的。
- 变量声明与空安全
- 不可为空类型:在Kotlin中,默认情况下变量是不可以为null的。
- 例如,
val nonNullableString: String = "Hello"
,这里nonNullableString
被声明为String
类型,并且不能被赋值为null。如果尝试将null赋值给这个变量,如nonNullableString = null
,编译器会报错。 - 可为空类型:如果想要一个变量可以为null,需要在类型后面加上
?
。 - 例如,
val nullableString: String? = null
。这样就明确告诉编译器这个变量可以容纳null值。
- 安全调用操作符(?.)
- 当处理可能为null的对象时,安全调用操作符是很有用的。
- 例如,假设有一个可能为null的字符串变量
nullableString
,如果想要调用它的length
属性,可以这样写:val length = nullableString?.length
。如果nullableString
为null,整个表达式的值为null,而不会抛出空指针异常。 - 考虑一个包含
Person
类的例子,Person
类有一个address
属性,address
类又有一个streetName
属性。如果person
对象或者person.address
可能为null,想要获取街道名称可以这样写:val streetName = person?.address?.streetName
。
- Elvis操作符(?:)
- Elvis操作符用于在一个表达式为null时提供一个默认值。
- 例如,
val result = nullableString?.length?: 0
。如果nullableString
为null,result
将被赋值为0;如果nullableString
不为null,result
将被赋值为nullableString.length
。 - 它也可以用于更复杂的场景,比如返回一个默认对象。假设
getUser()
函数可能返回null,而想要在返回null时得到一个默认用户对象,可以这样写:val user = getUser()?: DefaultUser()
。
- 非空断言操作符(!!)
- 这个操作符告诉编译器开发者已经确定变量不为null,并且如果变量实际上为null,会抛出空指针异常。
- 例如,
val nonNullValue = nullableString!!.length
。如果nullableString
为null,会在运行时抛出NullPointerException
。这种操作符应该谨慎使用,因为它绕过了Kotlin的空安全检查机制。
- 函数参数的空安全
- 在函数参数方面,Kotlin也支持空安全。
- 例如,
fun printLength(str: String) { println(str.length) }
,这个函数的参数str
是不可以为null的。如果尝试传入null,编译器会报错。如果想要函数参数可以为null,应该声明为fun printLength(str: String?) { if (str!= null) println(str.length) }
。这样在函数内部需要先检查参数是否为null,然后再进行相应的操作,以避免空指针异常。
Kotlin学习:1.7.语言基础之空安全
2025/2/23 1:18:12
来源:https://blog.csdn.net/weixin_35691921/article/details/122325266
浏览:
次
关键词:Kotlin学习:1.7.语言基础之空安全
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- Day01_Ajax入门
- RuntimeError: CUDA error: device-side assert triggered
- 爬虫案例3——爬取彩票双色球数据
- LabVIEW提高开发效率技巧----事件日志记录
- 安卓端侧大模型 MLC-LLM 部署全攻略:以 InternLM2.5-1.8B 为例
- 苹果iOS 17.6.1正式推送,有哪些机型值得更新呢?
- CosyVoice 实测,阿里开源语音合成模型,3s极速语音克隆,5分钟带你部署实战
- React Native 应用中预加载 SQLite 数据库的全面指南
- 2024华数杯C题解题思路、参考论文已出(无偿分享)~
- DSP——从入门到放弃系列2——PLL锁相环(持续更新)