Kotlin学习 - 可空系统类型

Kotlin通过在编译时期检查空指针异常,提升了代码的安全性。它引入了可空类型系统,如?操作符允许变量可能为空,?.操作符用于链式调用时的安全调用,?:操作符提供空合并功能,而!!操作符则表示确定非空但有潜在风险的强制解引用。这些特性帮助开发者避免运行时的空指针异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做Android开发的对NPE(NullPointerException)问题应该不会陌生,在我们公司NPE问题会归属于低级缺陷。

Kotlin针对这个问题做了改进,将空指针异常的检查提前到了编译时期,如果我们的程序存在空指针异常的风险,那么在编译的时候会直接报错,修正之后才能成功运行,这样就可以保证程序在运行时期不会出现空指针异常了。

例如:

fun main() {
    val student = Student("lucy", 19) 
    study(null)
}

fun study(student : Student) {
    student.doHomework()
}

我在调用study函数的时候塞了一个空,编译器会报错:Null can not be a value of a non-null type Study

Kotlin默认所有的参数和变量都不可为空,所以会传递null会直接报错。可是实际开发中,有些逻辑我们需要对null进行特别的处理。对这种需求,Kotlin提供了另外一套可为空的类型系统,我们需要在编译时期就将所有潜在的空指针异常都处理掉,否则代码将无法编译通过。

下面来学习Kotlin中可空类型系统常用的操作符。

操作符

上面的例子我们稍微改下,在study函数的入参后面加一个,这样可正常传递null对象,但是如果入参student为空,方法doHomework()调用提示错误,因此需要加一个空判断。

也就是说如果变量或常量后面加上,说明这个变量或者常量可以为空,在使用的时候需要注意。

fun main() {
    val student = Student("lucy", 19) 
    study(null)
}

fun study(student: Student?) {
    if (student != null){
        student.doHomework()
    }  
}

操作符?.

fun main() {
    val student = Student("lucy", 19) 
    study(null)
}

fun study(student: Student?) {
    student?.doHomework() 
}

每次判空都要加一个if判断,太过繁琐,可以使用操作符?.解决,这个符号表示,只有前面的对象不为空,后面的方法才能执行。

操作符?:

fun test(str: String?) {
    val newStr: String = if (str != null) {
        str
    } else {
        ""
    }
} 

上面的例子可以用操作符优化下;

fun test(str: String?) {
    val newStr: String = str ?: ""
}

?: 这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。

多个操作符一起使用;

fun getTextLength(str: String?) = str?.length ?: 0

由于str可能为空,因此我们在调用它的length字段时需要使用?.操作符,而当str为空时,str?.length会返回一个null值,这个时候我们再借助?:操作符让它返回0。

操作符!!

fun main() {
    val student = Student("lucy", 19) 
    study(null)
}

fun study(student: Student?) {
    student.doHomework() 
}

上面的例子在study函数的入参后面加一个,这样study就可能为空,因此编译器会提示错误,但是如果我们确认每次调用
study函数的入参都不为空,也可以使用!!操作符。

fun main() {
    val student = Student("lucy", 19) 
    study(student)
}

fun study(student: Student?) {
    student!!.doHomework() 
}

不过这是一种有风险的写法,编译虽然能过,但是运行时如果对象为空了会报空指针异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值