问题描述
定义的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函数声明时,在类型上如果不带上问号(如,定义为name: String,而非name: String?),则编译出的代码会自动带上空检查的代码,一旦为null,就会报错,具体代码如下:
Kotlin被调用函数转译为Java后代码
-
Kotlin调用声明为参数不可为null的函数时,对于调用者的代码中也会增加空检查,具体代码如下:
Kotlin调用类转译为Java后代码
编码建议
- 声明Kotlin函数时,需要注意是否允许输入参数为null,不带上问号,是不允许入参为null的。
- 调用Kotlin函数时,需要关注参数是否允许为null。如果不允许,则需要提前判断,参数为null时就不要调用了。
附录
Java、Kotlin互相调用测试结果图:

安卓开发技术分享: https://www.jianshu.com/p/442339952f26

网友评论