美文网首页安卓集中营安卓开发
使用Kotlin反而导致空指针异常的坑

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

作者: 蓝不蓝编程 | 来源:发表于2019-01-31 09:54 被阅读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

    相关文章

      网友评论

        本文标题:使用Kotlin反而导致空指针异常的坑

        本文链接:https://www.haomeiwen.com/subject/kyqksqtx.html