Kotlin和Java互调空指针相关的问题(两种可能NullPointerException的情况)

情况一

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中用可空类型去接收
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值