空类型、空安全

变量的定义

Kotlin中的变量修饰符只有两个

  • val修饰的变量不能重新被赋值
  • var修饰的变量可以被重新赋值

var修饰的变量不可为null,val修饰的可为null

val a: Int? = null
var b: Int

变量a在使用的时候需要判断改变量是否为null,变量b则不需要了,因为这个变量永远不会为null

可空类型的判断

if else

val str: String? = null
if(str == null){}else {}

使用?.判断

如果可空变量为null时,返回null
这种用法大量用于链式操作,能有效避免空指针异常

var str: String? = null
print(str?.length)

链式调用

print(str?.length?.plus(5)?.minus(10))

函数中使用可空类型

当一个函数有返回值时,如果返回的值为可空类型,那么方法的返回值类型后面也要加?

操作符

let

  • let操作符的作用:当使用符号?.验证的时候忽略掉null
  • let的用法: 变量?.let{}
val arrTest : Array<Int?> = arrayOf(1,2,null,3,null,5,6,null)// 传统写法
for (index in arrTest) {if (index == null){continue}println("index => $index")
}// let写法
for (index in arrTest) {index?.let { println("index => $it") }
}

?:操作符

当我们定义了一个可空类型的变量时,如果该变量不为空,则使用,繁殖使用另外一个不为空的值

val testStr : String? = nullvar length = 0// 例: 当testStr不为空时,输出其长度,反之输出-1// 传统写法
length = if (testStr != null) testStr.length else -1// ?: 写法
length = testStr?.length ?: -1println(length)

Evils操作符

Evils其实不是一个操作符,而是evil的复数,而evil的意思在这里可以理解为屏蔽、安全的操作符,这样的操作符有三种:

  • ?: 这个操作符表示在判断一个可空类型时,会返回一个我们自己设定好的默认值
  • !! 这个操作符在判断一个可空类型时,会抛出空指针异常
  • as? 这个操作符表示为安全的类型转换

!! 操作符

!! 操作符可谓是给爱好空引用异常的开发者使用,因为在使用一个可空类型变量时,在改后面加上!!操作符,会显示抛出的空指针异常

as?操作符

其实这里是指as操作符,表示类型转换,如果不能正常转换的情况下使用as?操作符。当使用as操作符的使用不能正常的转换的情况下会抛出类型转换(ClassCastException)异常,而使用**as?**操作符则会返回null,但是不会抛出异常

总结

  • 项目中会抛出空指针NullPointerException的情况

    • 在可空类型变量的使用时,用了!! 操作符
    • 显示抛出空指针 throw NullPointerException()
    • 外部Java代码导致的
    • 对于初始化,有一些数据不一致(如一个未初始化的this用于构造函数的某个地方)
  • 项目中会抛出类型转换ClassCastException的情况
    • 在类型转换中使用了as操作符
    • 使用了toString()、toInt()等方法不能转换
    • 外部Java代码导致
  • 尽量避免使用的操作符
    • 尽可能的不要使用!!操作副,多使用**?:、?.操作符,以及let{}**函数
    • 尽可能的使用as?操作副去替换掉as
    • 在不确定是否可以安全转换的情况下不使用**toString()**等方法

Kotlin初级(2)- - - 空安全.md相关推荐

  1. Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结

    在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...

  2. Kotlin——初级篇(二):变量、常量、注释

    在Kotlin中的变量.常量以及注释多多少少和Java语言是有着不同之处的.不管是变量.常量的定义方式,还是注释的使用.下面详细的介绍Kotlin中的变量.常量.注释的使用.以及和Java的对比. 如 ...

  3. 【Spring Boot 实战开发】第2讲 Kotlin类型系统与空安全

    幻灯片1.png Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.在 Java 开发领域的诸多著名框架:Spring ...

  4. Kotlin中的空判断

    Kotlin中的空判断 前言 字符串空判断 空字符串:"" 纯空格字符串:" " null字符串:null 值为null字符串:"null" ...

  5. Kotlin——初级篇(一):最详细的环境搭建

    众所周知,Kotlin出来已经良久了.Kotlin有着众多优势,不管是用于Android开发中,还是Java开发,都能缩减很大的代码量,大大提高了工作效率.而小生本人也是才从忙碌的个工作中抽身出来,有 ...

  6. 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)

    文章目录 I . Kotlin 变量总结 II . Kotlin 非空变量 III . 非空变量不能赋空 IV . lateinit 关键字 V . lateinit 初始化判定 VI . Kotli ...

  7. 《Kotlin项目实战开发》 第3章 类型系统与可空类型

    2019独角兽企业重金招聘Python工程师标准>>> 第3章 类型系统与可空类型 跟Java.C和C ++ 一样, Kotlin也是"静态类型编程语言". 通常 ...

  8. Kotlin中的一些判空操作、空安全

    前言 很久没有更新博客了,其实并不是因为太忙,也不是遇到的问题不多,是迷茫了,不知道怎么去写,总感觉自己一定会去好好的写文章(哈哈幻想中),但是从来没有动过笔,因为写不好,能力不够.但是还是要去动笔呀 ...

  9. Kotlin——中级篇(二): 属性与字段详解

    在前面的章节中,详细的为大家讲解到了Kotlin中对类的类的定义.使用.初始化.初始化.类继承等内容,但是在一个类中,几乎上是不可能不出现属性与字段(field)的,这一篇文章就为大家奉上Kotlin ...

最新文章

  1. rtsp发送主流和辅流
  2. 使用Linq Xml 来读取一个目录下所有的文件并保存为Xml文档
  3. python培训出来的有公司要吗-参加Python培训到底需要学什么?好程序员
  4. Excel 技巧篇-公式实现在指定范围内生成指定小数位的随机数
  5. Linux搭建oracle数据库
  6. html表情选择器,原生JS写的emoji表情选择器
  7. XML学习笔记(三)
  8. oracle hibernate 主键,oracle hibernate 主键自增
  9. 1021个位数字统计
  10. [转载] [转载] python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
  11. HTML 区块、内联元素
  12. Android开发实践:设计安卓应用以计算BMI指数
  13. java LPT1_Java 未知异常 求解
  14. 国标GB/T28181流媒体服务器安防4G摄像头互联网直播EasyGBS如何实现H265网页直播的?
  15. 深富策略:罕见巨额成交量背后蕴含深意
  16. java操作excel方法_Java实现操作excel表格的方法
  17. 服务器存储系统的模式,服务器的三种存储方式
  18. dwg文件怎么打开呢?dwg是啥呢?
  19. Android pm命令详解
  20. qqwry.dat的数据结构解释

热门文章

  1. Python学习笔记——数据分析之工作环境准备及数据分析建模理论基础
  2. android 文件存储基础
  3. NFS服务配置与mount nfs时-o nolock的问题
  4. 台式计算机小键盘,台式电脑软键盘在哪里,初学电脑
  5. 《关于费尔巴哈的提纲》 马克思主义哲学中人的本质
  6. 第五章习题——C程序设计(第四版)
  7. [Linux] 10. shell编程基础《updating》
  8. JAVA开发---微信文章留言功能实现
  9. kafka系列4:消息幂等性
  10. 手机网站开发的经验总结