详解Kotlin的空指针处理

 更新时间:2017年06月30日 09:50:58   作者:还不走  
这篇文章主要介绍了详解Kotlin的空指针处理的相关资料,需要的朋友可以参考下

详解Kotlin的空指针处理

Kotlin的空指针处理相比于java有着极大的提高,可以说是不用担心出现NullPointerException的错误,kotlin对于对象为null的情况有严格的界定,编码的阶段就需要用代码表明引用是否可以为null,为null的情况需要强制性的判断处理。

咋看一下这些在java里面其实也有,问题是一般开发中不写也是可以的(大部分开发不会花很多时间考虑这些),等出了空指针错误再一个个打补丁。这样往往会遗漏很多空指针,后期的解决仅仅是做一个if判断,没有从根源解决问题

变量需要知道是否可以为null

第一个与java的不同,kotlin声明引用时不可以直接赋值为null

var helloA: String=null //编译器直接报错 null can not be value of a non null type string

这里插一句,kotlin的成员变量(全局变量)必须要初始化甚至是基本数据类型都要手动给一个初始值,局部变量可以不用初始化,上面的例子是成员变量的声明。

编译器直接表示hello是一个non null type你不可以直接赋一个null值。对于我们java原住民来说声明变量时如果不去赋值,编译器会默认赋null(除去基本数据类型),在kotlin这是不允许的。

类型?

当某个变量的值可以为 null 的时候,必须在声明处的类型后添加 ? 来标识该引用可为空。

这是官方文档的说明,也就是说上面的变量声明只需要在String类型后面加一个?就可以解决这个错误。

var helloB : String? = null

如果不用?也可以直接初始化来解决问题

var helloA : String = "hello"

String和String?

helloA 和 helloB2个变量的类型分别为String和String?,这2种类型的区别在于引用时是否空安全,String?代表可能为空,引用不安全,String代表不会为空,引用安全。比如调用一下helloB的方法


可以看到有些方法是灰的代表不能直接调用,有些是白的代表可以直接调用,为什么可以直接调用后面再讲

helloB.length //Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
这里的错误解释简单的理解就是helloB是一个可能为空的类型(String?),对于可空类型你必须做判空的处理才能调用方法。有没有爱上kotlin? wtf太厉害了

如何做判空处理

最简单的方法就是使用?.来调用方法。这个符号的意义是,当helloB不为空调用.length方法,返回Int值,如果helloB为空则返回null。

helloB?.length

注意这里的返回值类型为Int? 依然是可以为空的类型

不推荐的写法!!这个操作符可以说是为了空指针错误爱好者准备的,使用了!!操作符代表你不关心变量的空判断可以报出NullPointerException,又或者你有绝对的自信这里肯定不为空,可以放心的调用,可以说!!放弃了判空的检查

helloB!!.length

Elvis 操作符?:

回到?.的调用上来,这个调用方式存在一个让人不安的处理,就是在变量为null的情况下,会直接返回null,这样空指针的隐患还在。

var l : Int = helloB?.length //报错类型不匹配 Int? 和 Int

修正的话需要通过if判断来进行判空处理

var l: Int = if (helloB?.length != null) helloB.length else -1

这种写法可以简化成Elvis 操作符?:

var le: Int = helloB?.length ?: 0

当?:左边非空返回左边的值,左边为空则返回右边的值

最后前文提到的当helloB为空时有些方法仍然可以调用比如equals方法

helloB.equals(helloA)

即使helloB为可空类型依然可以调用equals方法,但是这里的equals方法并不是String.java的equals方法,而是StringJvm.kt中的equals方法

public fun String?.equals(other: String?, ignoreCase: Boolean = false): Boolean {
  if (this === null)
    return other === null
  return if (!ignoreCase)
    (this as java.lang.String).equals(other)
  else
    (this as java.lang.String).equalsIgnoreCase(other)
}

关键代码

this===null
return other === null

这个方法对变量本身为null的情况已经做了判断,同时方法写成了String?.equals可以让String?类型的对象直接调用这个equals方法

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • java使用JSCH实现SFTP文件管理

    java使用JSCH实现SFTP文件管理

    这篇文章主要为大家详细介绍了java使用JSCH实现SFTP文件管理,实现上传、下载等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • 使用Feign调用第三方http接口

    使用Feign调用第三方http接口

    这篇文章主要介绍了使用Feign调用第三方http接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 解析java.library.path和LD_LIBRARY_PATH的介绍与区别

    解析java.library.path和LD_LIBRARY_PATH的介绍与区别

    这篇文章主要介绍了java.library.path和LD_LIBRARY_PATH的介绍与区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • JAVA实现生成短链接的示例代码

    JAVA实现生成短链接的示例代码

    短链接就是将长度较长的链接压缩成较短的链接,本文就来介绍一下JAVA实现生成短链接的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 关于Springboot日期时间格式化处理方式总结

    关于Springboot日期时间格式化处理方式总结

    这篇文章主要介绍了关于Springboot日期时间格式化处理方式总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • SpringBoot框架中Mybatis-plus的简单使用操作汇总

    SpringBoot框架中Mybatis-plus的简单使用操作汇总

    这篇文章主要介绍了SpringBoot框架中Mybatis-plus的简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • Java程序员面试中的多线程问题总结

    Java程序员面试中的多线程问题总结

    这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到。
    2016-11-11
  • JDK8中的HashMap初始化和扩容机制详解

    JDK8中的HashMap初始化和扩容机制详解

    这篇文章主要介绍了JDK8中的HashMap初始化和扩容机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式

    这篇文章主要介绍了java之idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解Java反射实现Aop代理

    详解Java反射实现Aop代理

    本篇文章主要介绍了Java 反射实现 Aop 代理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论