Kotlin Java互调报错:java.lang.NullPointerException: Parameter specified as non-null is null

Kotlin Java互调报错:java.lang.NullPointerException: Parameter specified as non-null is null

fun main(args: Array<String>) {
    MyJavaCls()
}

Java里面调用Kotlin的方法,故意传进去 null

public class MyJavaCls {
    public MyJavaCls() {
        MyKtCls ktCls = new MyKtCls();
        String s = null;
        ktCls.setMyValue(s);
    }
}

class MyKtCls {
    fun setMyValue(s: String) {
        println(s)
    }
}

运行报错:

Exception in thread "main" java.lang.NullPointerException: Parameter specified as non-null is null: method MyKtCls.setMyValue, parameter s
    at MyKtCls.setMyValue(MyKtCls.kt)
    at MyJavaCls.<init>(MyJavaCls.java:5)
    at MainKt.main(Main.kt:2)

因为Java语言中有些情况是允许传入 null,而在Kotlin中,除非特别声明,不能传 null。

修复方式有两种:

(1)Kotlin里面处理。在MyKtCls里面增加 ?,允许传 null:

class MyKtCls {
    fun setMyValue(s: String?) {
        println(s)
    }
}

(2)Java层面处理。拦截null。

扫描二维码关注公众号,回复: 16211494 查看本文章
public class MyJavaCls {
    public MyJavaCls() {
        MyKtCls ktCls = new MyKtCls();
        String s = null;
        if (s != null)
            ktCls.setMyValue(s);
    }
}

kotlin常用表达式let,?:,as?,?.,!!_zhangphil的博客-CSDN博客it.todo() //函数内使用it替代object对象访问属性和方法。it.todo() //object不为null,才会执行let函数。当a不为null时,执行大括号里的语句(it肯定不为null)如果a == null ,则为 null。= null,则a.b()如果 a 不是 b,则为 null。如果a 是 b,则 a as b。当a为null时,什么都不执行。如果a==null,抛出空指针。=null时,执行a。当a==null时,执行b。https://blog.csdn.net/zhangphil/article/details/129264159kotlin,null let expression_zhangphil的博客-CSDN博客当a不为null时,执行大括号里的语句(it肯定不为null)如果a == null ,则为 null。= null,则a.b()如果 a 不是 b,则为 null。当a==null时,执行b。当a不为null时,执行大括号里的语句(it肯定不为null)如果a == null ,则为 null。= null,则a.b()如果 a 不是 b,则为 null。当a==null时,执行b。kotlin的let,with,run,apply,also,异同区别_zhangphil的博客-CSDN博客。https://blog.csdn.net/zhangphil/article/details/130538081

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/132307061
今日推荐