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。
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