码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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中用可空类型去接收
  • 相关阅读:
    二分查找的多种实现方式及本质解析(c++实现 + 例题)
    segment方案解决VXLAN分布式网关DCI间互联
    如何写出一手让同事膜拜的漂亮代码?
    JAVA异常输出到控制台
    Python面向对象丨面向过程和面向对象,你真的了解“对象”吗?
    投资风险管理
    基于Label studio实现UIE信息抽取智能标注方案,提升标注效率!
    C语言——函数栈帧的创建和销毁
    数据一致性:双删为什么要延时?
    【重温经典C语言】~c语言中%x、%c、%d、%x等等等、c语言取地址符&的作用、C语言中的 联合体
  • 原文地址:https://blog.csdn.net/Goals1989/article/details/126964125
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号