0
点赞
收藏
分享

微信扫一扫

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


问题描述

定义的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反而导致空指针异常的坑_javascript

使用Kotlin反而导致空指针异常的坑_外部调用_02

原因分析


  1. Kotlin函数声明时,在类型上如果不带上问号(如,定义为name: String,而非name: String?),则编译出的代码会自动带上空检查的代码,一旦为null,就会报错,具体代码如下:
    使用Kotlin反而导致空指针异常的坑_函数定义_03
  2. Kotlin调用声明为参数不可为null的函数时,对于调用者的代码中也会增加空检查,具体代码如下:
    使用Kotlin反而导致空指针异常的坑_函数定义_04

编码建议


  1. 声明Kotlin函数时,需要注意是否允许输入参数为null,不带上问号,是不允许入参为null的。
  2. 调用Kotlin函数时,需要关注参数是否允许为null。如果不允许,则需要提前判断,参数为null时就不要调用了。

#附录

Java、Kotlin互相调用测试结果图:

使用Kotlin反而导致空指针异常的坑_函数定义_05



举报

相关推荐

0 条评论