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並不會導致該問題;
在這裏插入圖片描述

當Kotlin函數可能被Java調用時, 必須將參數聲明爲可空類型, 即添加問號後綴。

class DemoClass {
    fun method(str: String?) {
        System.out.println("執行了method函數")
        System.out.println(str)
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章