本文共 953 字,大约阅读时间需要 3 分钟。
看下这段代码执行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) }}
转载地址:http://ukqvb.baihongyu.com/