看下这段代码执行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)
}
}
本文探讨了Kotlin中非空参数的使用及其与Java交互时的问题。通过一个具体示例,展示了当从Java调用Kotlin代码并传递null值时,Kotlin会抛出异常的情况。文章还提供了解决方案,即在Kotlin函数中将可能接收到null的参数声明为可空类型。
3335

被折叠的 条评论
为什么被折叠?



