• Kotlin调用Java代码时引起空指针异常,要怎么避免?


    前提

    Android项目中,经常会出现Kotlin 代码调用Java代码的情况,而在Kotlin编译器中,有这样一个默认的规定,如果Java中的代码被Nullable标记才认为是可控类型,否则, 如果你不指定为可空类型,利用类型推断会直接断定为非空类型。

    代码示例:

    # Java代码
    public class Tools {
    	public static String getStr1() {
    		// 此处返回一个可能为null的String
    	}
    	
    }
    
    # Kotlin 代码
    val str1 = Tools.getStr1()  // 类型推断为非空类型,如果此时直接调用str1.xxx则会产生空指针异常。
    解决方案有两种:
    1、我们可以提前指定一下类型为可空
    val str1: String? = Tools.getStr1()
    
    2、 在Java代码中增加@Nullable注释
    public class Tools {
    	@Nullable
    	public static String getStr1() {
    		// 此处返回一个可能为null的String
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    开发时注意点

    1、作为开发者新建的Java类,利用好@Nullable@Nonnull注释

    在Java里边最麻烦的便是空指针异常,而即使转到了Kotlin,当调用Java 代码时,仍然会存在这样的问题。所以,在我们写java代码时,就要注意,对于可控类型先用@Nullable标记下。

    2、使用Kotlin调用系统Java代码时,若存在返回值,请先确认是否可空

    老的Java代码、或者第三方代码很少会有@Nullable注释,包括Android框架中的代码,也不是所有的地方都加了该注释,这样不利于Kotlin编译器进行类型推断,当没被@Nullable标记时,我们写代码时,会默认为非空类型。此时我们需要确认对应的代码是否可空,如果可空,请先指定为可控类型。

    案例:

    在Android 通知栏Notification中有这样一个属性:contentView

    val notificaiton: Notification……
    val layoutId = notification.contentView.layoutId
    
    • 1
    • 2

    在大多数情况下是没问题的,但是在一些情况下,contentView压根就不存在,就会返回空值。

     @Deprecated
     public RemoteViews contentView;
    
    • 1
    • 2

    这是Android官方的定义,没有标记@Nullable,而在某些机型中,就会获取到空值。

  • 相关阅读:
    Promise详解
    浏览器多开,数据之间相互不干扰
    谁在领跑纯电动L2
    QT pyside2 线程嵌套子线程 实现开始运行和停止运行
    打造高性能应用,持续优化用户体验
    计算机网络——数据链路层介质访问控制
    卡口车辆智能检索系统
    中级工程师的职称好评吗?怎么评中级工程师?需要什么材料?
    优化Java中XML和JSON序列化
    供应商管理流程涉及哪些内容?使用SRM供应商软件助力企业打造智慧采购新引擎
  • 原文地址:https://blog.csdn.net/yztbydh/article/details/128040537