java调用kotlin_Java调用Kotlin函数的坑

看下这段代码执行main函数结果如何, 会打印"执行了method函数"么?

class DemoClass {

fun method(str: String) {

System.out.println("执行了method函数")

System.out.println(str)

}

}

public class HelloJava {

public static void main(String[] args) {

DemoClass object = new DemoClass();

object.method(null);

System.out.println("程序执行完毕");

}

}

在kotlin参数校验时就会crash, 并没有执行到函数体内。

Exception in thread “main” java.lang.IllegalArgumentException: Parameter specified as non-null is null: method com.brycegao.basic.DemoClass.method, parameter str

at com.brycegao.basic.DemoClass.method(DemoClass.kt)

at com.brycegao.basic.HelloJava.main(HelloJava.java:6)

反编译DemoClass.class可以看到字节码里有参数判空的操作, 跟Java语言使用的@NonNull有显著区别。 Kotlin声明非空参数类型时,Java传入了null会导致崩溃; 而Java声明函数参数@NonNull, 运行时传入null并不会导致该问题;

2bf53095a1336e4465b186150c58d087.png

当Kotlin函数可能被Java调用时, 必须将参数声明为可空类型, 即添加问号后缀。

class DemoClass {

fun method(str: String?) {

System.out.println("执行了method函数")

System.out.println(str)

}

}


版权声明:本文为weixin_39936792原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。