Kotlin空安全类型之平台类型

54 篇文章 2 订阅
14 篇文章 0 订阅

前言

众所周知,Kotlin的空安全很方便,能避免绝大部分的空安全问题
一般类型分为:
可空类型如 String?
不可空类型 String

其中可空类型的String?可以赋值null或String类型的值,在使用时必须显式的进行空处理
而不可空类型的String,只能赋值String类型,无法向其赋值null,使用时无需空处理,也不会遇见空指针异常
但为什么我上面说能避免绝大部分的空安全问题呢?是因为Kotlin为了兼容其他语言,还有对应语言平台的平台类型 String!

还有延迟初始化的类型
lateinit var String

当然lateinit不是本篇的重点,我们接下来详细了解一下平台类型

正文

平台类型无法通过Kotlin直接声明出来,只会在使用对应平台语言时出现,比如在jvm平台上使用Java语言

 

我们在Kotlin中使用Java的api时,如果Java的api没有加空安全注解的话,Kotlin就会将其类型识别为平台类型

这时我们可以将这个类型的值当作可空类型处理,也可以当作不可空类型处理(就像在Java中那样)
而如果其的值为null,我们没有?.而是.调用后就会触发空指针异常

空指针触发情景

1.将平台类型当作不可空类型使用
比如:
Java.getString().length

由于直接获取平台类型 的属性值,而getString()返回了null,此时就会触发空指针

2.将平台类型传递到方法的非空参数中
比如:

fun a(s:String){}
a(Java.getString())

Kotlin会在编译时给方法的非空参数加上以下校验代码:
Intrinsics.checkNotNullParameter(s, "s");//如果s为null就会抛异常

3.可能会成为隐藏的地雷
比如:

        var imei: String = ""
        try {
            imei = getImei()
        } catch (e: Exception) {
            ...
        }
        imei.length()

这里可能会有错觉,如果imei抛异常,就不会修改原有的空字符串imei
但如果getImei()返回了null,这样没有抛异常,且也将imei给赋值为了null,在后续使用的时候才会触发空指针异常

解决方案

1.给Java api增加 @Nullable 或 @NotNull 注解
他们表示Java中类型的空安全性,Kotlin可以直接识别注解,确定其空安全类型
Java中可以在使用的过程中提示一些空安全警告信息

2.尽量将Java api转为Kotlin api使用
这样可以避免平台类型的出现,完善空安全类型

3.如果可以,尽量将平台类型赋值给可空类型或当作可空类型使用

扩展

修改设置可以直接看到Kotlin推断的类型

修改完就会变成这样

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值