情况一
Java调用Kotlin时,强制传入一个空值,可能会抛出空指针异常
Java代码
public class MyJava{
@Test
public void test(){
MyKotlin.getValue(null);
}
}
- Java调用了Kotlin中的代码,并且强制传入一个null,抛出空指针异常
- 注意:编译时可以通过,此处是运行时异常
java.lang.NullPointerException: Parameter specified as non-null is null: method com.zhangyu.myapplication.MyKotlin.getValue, parameter id
at com.zhangyu.myapplication.MyKotlin.getValue(Mete.kt)
at com.zhangyu.myapplication.MyJava.test(MyTest.java:9)
- kotlin代码(id: String)非空类型
- 解决办法:id:String?使用可空类型接收
object MyKotlin{
@JvmStatic
fun getValue(id: String) {
println("getValue: $id")
}
}
- 原因在于我们将Kotlin转成Java后可以看出Intrinsics.checkNotNullParameter(id, “id”);
- Kotlin转换成Java的方法(Tools—Kotlin—Show Kotlin Bytecode—Decompile)
@JvmStatic
public static final void getValue(@NotNull String id) {
Intrinsics.checkNotNullParameter(id, "id");
String var1 = "getValue: " + id;
boolean var2 = false;
System.out.println(var1);
}
- 其中如果id为null则抛出异常
public static void checkNotNullParameter(Object value, String paramName) {
if (value == null) {
throwParameterIsNullNPE(paramName);
}
}
情况二
Kotlin调用Java方法后返回一个null
- 会崩溃的情况
val str: String,已经定义好了str不能为null - 解决办法:
- 定义val str: String?,可空类型去接收(推荐)
- 使用不确定类型去接收val str ,这样做会接收到一个String!类型,当为空时,在使用的时候如果不判空,就会空指针异常
class MyKotlin{
@Test
fun test() {
//调用java
val str: String = MyJava.getValue()
println(str)
}
}
public class MyJava{
public static String getValue() {
return null;
}
}
java.lang.NullPointerException: MyJava.getValue() must not be null
at com.zhangyu.myapplication.MyKotlin.test(MyKotlin.kt:9)
总结
- 根本原因在于Kotlin中严格区分了非空类型和可空类型,如果用非空类型去接收Java传来的null,则会抛出NullPointerException
- 解决办法:
Java与Kotlin互调时,Kotlin中用可空类型去接收