解决kotlin.KotlinNullPointerException以及问题分析

        学习Kotlin过程中难免会遇到kotlin.KotlinNullPointerException这个问题,

        尼玛,kotLin不是传说中的空值安全吗?怎么会出现空指针异常。好吧,我不是来吐槽的。

        这个异常的原因是定义变量或调用变量时使用了!!比如      

    var mainHandeler: Handler = null !!

 

    val x: Int? = null
    val y = x!!.toDouble()

        这个"!!"是非空断言,就是你认为它不是空的,跳过编辑器的检查,但如果它真的是空的,就出现上kotlin.KotlinNullPointerException异常。

如上面的第二段代码,转成java代码如下:

Integer var10000 = this.x;
if (var10000 == null) {
   Intrinsics.throwNpe();
}

double y = (double)var10000;

        可以看出实际运行时也是先做了判断,如果为空则直接抛出异常。这个异常就是KotlinNullPointerException

        明白了问题产生的原因下面就说说如何解决这个问题

        1,用val而不是var

        在 Kotlin 中 val 代表常量,var 代表变量。建议尽可能多的使用 val。val 是线程安全的,并且不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。

        2,使用lateinit

        有些情况我们不能使用 val,比如,在 Android 中某些属性需要在 onCreate() 方法中初始化。对于这种情况,Kotlin 提供了 lateinit 关键字。

private lateinit var disposable:Disposable

要注意,访问未初始化的 lateinit 属性会导致 UninitializedPropertyAccessException。并且 lateinit 不支持基础数据类型,比如 Int。

        3,使用let函数        

        

    val x: Int? = null
    x?.let{ val y = x!!.toDouble() }

        也就是判断x不为空时才走let{}中的代码

        4,使用Elvis运算符

        对于let函数,我们是判断不为空才走的,但如果为空时我们想做一些操作怎么办?用Elvis运算符

        

fun getUserName(): String {
   return mUserName ?: "Anonymous"
}

代码等同于

fun getUserName(): String {
   if (mUserName != null) {
       return mUserName!!
   } else {
       return "Anonymous"
   }
}

参考:https://zhuanlan.zhihu.com/p/27285806?utm_source=tuicool&utm_medium=referral

https://www.cnblogs.com/figozhg/p/6686798.html

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值