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


    情况一

    Java调用Kotlin时,强制传入一个空值,可能会抛出空指针异常

    Java代码

    1. public class MyJava{
    2. @Test
    3. public void test(){
    4. MyKotlin.getValue(null);
    5. }
    6. }
    • Java调用了Kotlin中的代码,并且强制传入一个null,抛出空指针异常
    • 注意:编译时可以通过,此处是运行时异常
    1. java.lang.NullPointerException: Parameter specified as non-null is null: method com.zhangyu.myapplication.MyKotlin.getValue, parameter id
    2. at com.zhangyu.myapplication.MyKotlin.getValue(Mete.kt)
    3. at com.zhangyu.myapplication.MyJava.test(MyTest.java:9)
    • kotlin代码(id: String)非空类型   
    • 解决办法:id:String?使用可空类型接收
    1. object MyKotlin{
    2. @JvmStatic
    3. fun getValue(id: String) {
    4. println("getValue: $id")
    5. }
    6. }
    • 原因在于我们将Kotlin转成Java后可以看出Intrinsics.checkNotNullParameter(id, “id”);
    • Kotlin转换成Java的方法(Tools—Kotlin—Show Kotlin Bytecode—Decompile)
    1. @JvmStatic
    2. public static final void getValue(@NotNull String id) {
    3. Intrinsics.checkNotNullParameter(id, "id");
    4. String var1 = "getValue: " + id;
    5. boolean var2 = false;
    6. System.out.println(var1);
    7. }
    • 其中如果id为null则抛出异常
    1. public static void checkNotNullParameter(Object value, String paramName) {
    2. if (value == null) {
    3. throwParameterIsNullNPE(paramName);
    4. }
    5. }

    情况二

    Kotlin调用Java方法后返回一个null

    • 会崩溃的情况
      val str: String,已经定义好了str不能为null
    • 解决办法:
      • 定义val str: String?,可空类型去接收(推荐)
      • 使用不确定类型去接收val str ,这样做会接收到一个String!类型,当为空时,在使用的时候如果不判空,就会空指针异常     
    1. class MyKotlin{
    2. @Test
    3. fun test() {
    4. //调用java
    5. val str: String = MyJava.getValue()
    6. println(str)
    7. }
    8. }
    1. public class MyJava{
    2. public static String getValue() {
    3. return null;
    4. }
    5. }
    1. java.lang.NullPointerException: MyJava.getValue() must not be null
    2. at com.zhangyu.myapplication.MyKotlin.test(MyKotlin.kt:9)

    总结

    • 根本原因在于Kotlin中严格区分了非空类型和可空类型,如果用非空类型去接收Java传来的null,则会抛出NullPointerException
    • 解决办法:
      Java与Kotlin互调时,Kotlin中用可空类型去接收
  • 相关阅读:
    Arduino Firmata + PyFirmata
    C语言——八股文(笔试面试题)
    将 Spring Boot 项目发布到 Docker 容器,简化部署过程!
    docker私有仓库harbor部署和管理
    ABP框架之——数据访问基础架构
    【C++】vector的介绍 | 常见接口的使用
    强化学习简介
    Minecraft 1.19.2 Forge模组开发 05.矿石生成
    【DBA100人】李建明:一名普通DBA的14年技术之路与成长智慧
    MoeCTF2023web
  • 原文地址:https://blog.csdn.net/Goals1989/article/details/126964125