参考之前的例子Kotlin笔记12–接口_南国樗里疾的博客-CSDN博客
https://blog.csdn.net/weixin_44021334/article/details/117931362
假设封装了一个方法,
fun doStudy(study: Study){
study.readBooks()
study.doHomeWork()
}
乍一看,没问题,细想下,如果传入的参数是 null ,不就空指针异常看吗 ?
简单,改进下,
fun doStudy(study: Study){
if (study != null){
study.readBooks()
study.doHomeWork()
}
}
Java 里也按照这种方式改。但既然是学 Kotlin ,整点新鲜的。
如下代码,
fun main(){
doStudy(null)
}
fun doStudy(study: Study){
study.readBooks()
study.doHomeWork()
}
doStudy(null) 这句会报异常 Null can not be a value of a non-null type Study
。
Kotlin 将空指针异常的检查提前到了编译时期,编译的时候就检查了,如果有空指针异常的风险,直接编译报错,降低了空指针异常的情况。
但有些方法就是要传 null 参数,于是用到 可空系统类型 。
Kotlin 的可空系统类型,需要我们在编写代码的时候将可能的空指针异常处理掉。
可空系统类型的使用规则是,在类名后加一个问号,如 Int?
。
用前面的方法试下,
fun doStudy(study: Study?){
study.readBooks()
study.doHomeWork()
}
这样,方法体内的两行代码报黄,提示 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Study?
简言之,要处理空指针异常,
改进下,于是有,
fun doStudy(study: Study?){
if (study != null){
study.readBooks()
study.doHomeWork()
}
}
这样,就完成了。
总结:
可空系统类型就是在类名后加问号;
使用可空系统类型需要处理空指针异常。