您当前的位置: 首页 >  kotlin

蓝不蓝编程

暂无认证

  • 0浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

使用Kotlin反而导致空指针异常的坑

蓝不蓝编程 发布时间:2019-01-31 09:54:49 ,浏览量:0

问题描述

定义的Kotlin函数,如果输入参数不允许为null(即使函数内部并不要求此参数为非null),则当调用者传入null时,必然会导致空指针异常。 Kotlin函数定义样例(包含输入参数允许为null和不允许为null):

class TestKotlin {
    /**
     * 输入参数不允许为null样例
     */
    fun testWithNonNullParam(name: String) {
    }
    /**
     * 输入参数允许为null样例
     */
    fun testWithNullableParam(name: String?) {
    }
}

Kotlin异常调用样例(Activity中调用,外部调用者未给本activity传入name的intent):

private fun test() {
        val name = intent.getStringExtra("name")
        TestKotlin().testWithNonNullParam(name)
    }

Java异常调用样例(Activity中调用,外部调用者未给本activity传入name的intent):

private void test() {
        String name = getIntent().getStringExtra("name");
        new TestKotlin().testWithNonNullParam(name);
    }

异常报错堆栈: Kotlin调用报错 Java调用报错

原因分析
  1. Kotlin函数声明时,在类型上如果不带上问号(如,定义为name: String,而非name: String?),则编译出的代码会自动带上空检查的代码,一旦为null,就会报错,具体代码如下: Kotlin被调用函数转译为Java后代码
  2. Kotlin调用声明为参数不可为null的函数时,对于调用者的代码中也会增加空检查,具体代码如下: Kotlin调用类转译为Java后代码
编码建议
  1. 声明Kotlin函数时,需要注意是否允许输入参数为null,不带上问号,是不允许入参为null的。
  2. 调用Kotlin函数时,需要关注参数是否允许为null。如果不允许,则需要提前判断,参数为null时就不要调用了。

#附录 Java、Kotlin互相调用测试结果图: image.png

安卓开发技术分享: https://blog.csdn.net/yinxing2008/article/details/84555061

关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0370s