Kotlin学习:1.7.语言基础之空安全

  1. 概述
    • Kotlin的空安全是其语言的一个重要特性。它旨在在编译时期就尽可能地避免空指针异常(NullPointerException),这是在许多编程语言(如Java)中常见且难以调试的问题。在Kotlin中,类型系统可以区分一个变量是可以为null的还是不可以为null的。
  2. 变量声明与空安全
    • 不可为空类型:在Kotlin中,默认情况下变量是不可以为null的。
    • 例如,val nonNullableString: String = "Hello",这里nonNullableString被声明为String类型,并且不能被赋值为null。如果尝试将null赋值给这个变量,如nonNullableString = null,编译器会报错。
    • 可为空类型 :如果想要一个变量可以为null,需要在类型后面加上?
    • 例如,val nullableString: String? = null。这样就明确告诉编译器这个变量可以容纳null值。
  3. 安全调用操作符(?.)
    • 当处理可能为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
  4. Elvis操作符(?:)
    • Elvis操作符用于在一个表达式为null时提供一个默认值。
    • 例如,val result = nullableString?.length?: 0。如果nullableString为null,result将被赋值为0;如果nullableString不为null,result将被赋值为nullableString.length
    • 它也可以用于更复杂的场景,比如返回一个默认对象。假设getUser()函数可能返回null,而想要在返回null时得到一个默认用户对象,可以这样写:val user = getUser()?: DefaultUser()
  5. 非空断言操作符(!!)
    • 这个操作符告诉编译器开发者已经确定变量不为null,并且如果变量实际上为null,会抛出空指针异常。
    • 例如,val nonNullValue = nullableString!!.length。如果nullableString为null,会在运行时抛出NullPointerException。这种操作符应该谨慎使用,因为它绕过了Kotlin的空安全检查机制。
  6. 函数参数的空安全
    • 在函数参数方面,Kotlin也支持空安全。
    • 例如,fun printLength(str: String) { println(str.length) },这个函数的参数str是不可以为null的。如果尝试传入null,编译器会报错。如果想要函数参数可以为null,应该声明为fun printLength(str: String?) { if (str!= null) println(str.length) }。这样在函数内部需要先检查参数是否为null,然后再进行相应的操作,以避免空指针异常。
相关推荐
沉沙丶16 分钟前
关于matlab分析电流THD的一些探究和记录
开发语言·matlab·电机控制·foc·永磁同步电机·模型预测·预测控制
chase。17 分钟前
Python包构建工具完全指南:python -m build 使用详解
开发语言·chrome·python
SuperEugene22 分钟前
前端 utils 工具函数规范:拆分 / 命名 / 复用全指南,避开全局污染等高频坑|编码语法规范篇
开发语言·前端·javascript
古城小栈30 分钟前
Go 底层代码的完整分类
开发语言·后端·golang
耳冉鹅34 分钟前
Go无锁共享内存环形缓冲区设计
开发语言·golang
计算机安禾44 分钟前
【C语言程序设计】第36篇:二进制文件的读写
c语言·开发语言·c++·算法·github·visual studio code·visual studio
子非鱼@Itfuture1 小时前
try-catch和try-with-resources区别是什么?try{}catch(){}和try(){}catch(){}有什么好处?
java·开发语言
Amumu121381 小时前
Js:内置对象
开发语言·前端·javascript
2301_807367191 小时前
C++代码风格检查工具
开发语言·c++·算法
飞Link1 小时前
具身智能音频处理核心框架 PyAudio 深度拆解与实战
开发语言·python·音视频