看下這段代碼執行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)
}
}