安卓集中营安卓开发

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

2019-01-31  本文已影响3人  蓝不蓝编程

问题描述

定义的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://www.jianshu.com/p/442339952f26

上一篇 下一篇

猜你喜欢

热点阅读