java 与 kotlin 混编遇到的坑

2,643 阅读1分钟

可空值与非空值

最近公司项目中踩到一个java与kotlin混编的坑,原因就是kotlin中声明的非空变量调用了java中的方法返回的变量值,导致kotlin非空机制失效

用代码说明下这个问题

kotlin代码

错误写法

fun testJavaKotlinCompile() {
    val nonNullList = ArrayList<String>()
    //此处ide和编译器都检查不出nonNullList添加了java的null String
    nonNullList.add(getNullString())
    
    nonNullList.foreach{ nonNullStr->
        //此处会直接crash,因为nonNullStr为空,和上面我们声明的非空变量冲突
        nonNullStr.length();
    }
}

正确写法

fun testJavaKotlinCompile() {
    val nonNullList = ArrayList<String>()
    //使用java中方法返回值时,添加?.进行非空判断
    getNullString()?.let{
        nonNullList.add(it)  
    }

    nonNullList.foreach{ nonNullStr->
        nonNullStr.length();
    }
}

java代码

public String getNullString(){
    return null;
}