看下这段代码执行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并不会导致该问题;
当Kotlin函数可能被Java调用时, 必须将参数声明为可空类型, 即添加问号后缀。
class DemoClass {
fun method(str: String?) {
System.out.println("执行了method函数")
System.out.println(str)
}
}