前言
简单记录一下Kotlin中 空值处理的方式。记录于此方便自己查阅。
正文
一般情况下,一个变量默认是非空类型。
当某个变量的值可以为空时,必须在声明处的数据类型后添加“?”来标识该引用可为空。
var name:String //非空变量 var age:Int? //可空变量
非空变量
当给非空变量name赋值为null时编译器会提示
Null can not be a value of a non-null type String
也就是无法通过编译。
可空变量
在使用可空变量时,如果不知道该变量的初始值,则需要将其赋值为null,否则会报“variable 'age' must be initialized”异常。
var age:Int? Log.d(TAG, "test: $age")
使用时,编译器会有如下提示:
Variable 'age' must be initialized
安全调用符
由于可空变量可能是null,在调用前需要进行判断。
常用的方式,先判断,如果不为null才调用变量的方法
var name: String? = null if(null == name){ Log.d(TAG, "test: null") }else{ Log.d(TAG, "test: ${name.length}") }
不够简洁,因此Kotlin中提供一个安全调用符
?.
使用方式
变量?.成员
比如上面的可以改为
var name: String? = null Log.d(TAG, "test: ${name?.length}")
如果name为null,返回null,否则返回name.length的值。
Elvis操作符
在使用安全调用符调用可空变量中的成员方法或属性时,如果当前变量为空,则会返回一个null值,但有时即使当前变量为null,也不想返回一个null值而是指定一个默认值。
此时Kotlin中提供了一个Elvis操作符(?:),通过Elvis操作符(?:)可以指定可空变量为null时,调用该变量中的成员方法或属性的返回值,其语法格式为“表达式?:表达式”。
-
如果左侧表达式非空,则返回左侧表达式的值,否则返回右侧表达式的值。
-
当且仅当左侧为空时,才会对右侧表达式求值。
var name: String? = null Log.d(TAG, "test: ${name?.length ?: 0}")
此时返回的不是null而是0。
非空断言
非空断言(!!.)会将任何变量(可空类型变量或者非空类型变量)转换为非空类型的变量,若该变量为空则抛出异常。
var name: String? = null Log.d(TAG, "test: ${name!!.length}")
由于name为null,因此调用时这里会抛出异常NullPointerException。
安全调用和非空断言对比
操作符 | 安全 | 推荐 |
---|---|---|
安全调用符(?.) | 当变量值为null时,不会抛出异常,安全 | 推荐使用 |
非空断言(!!.) | 当变量值为null时,抛出异常,不安全 | 可空类型变量经过非空断言后,这个变量变为非空变量,当非空变量为null时,不能继续调用变量中的方法或属性。 |
参考文章
历史上的今天
暂无评论...
随机推荐
Android ListView 滚动条的简单记录
前言用了多次还是容易忘记,因此这里记录一下,方便自己查阅。好记性不如烂笔头主要是摘抄的。正文android:scrollbars是否显示滚动条,它的取值可以是vertical,horizontal或none。android:scrollbarThumbVertical控制垂直滚动条...
startActivity源码分析1
前言简单记录一下startActivity()源码的启动过程,主要是过一下流程,细节太多顾不上。下面以Launcher界面启动(startActivity())未启动过的应用为例。这部分主要涉及,启动新的Activity前,系统会让当前Activity[叫Launcher吧]进入onPaus...
JNI之函数介绍四之数组操作
前言今天介绍一下JNI中数组相关操作函数。正文GetArrayLength # env: JNI 接口指针# array: Java 数组对象jsize GetArrayLength(JNIEnv *env, jarray array);返回数组中的元素数(数组的长度)。NewOb...
纪伯伦:岸边一捧沙
爱情的忧愁歌唱着,知识的忧愁谈论着,欲望的忧愁悄语着,贫穷的忧愁号哭着。但是,还有一种忧愁,比爱情更深沉,比知识更高贵,比欲望更有力,比贫穷更苦涩。不过,它哑然无声,眼睛像星星一样闪闪发亮。当你遇遭不幸,向邻居诉说时,你正将自己心灵的一部分托付给他。倘若他胸怀宽阔,他会感谢你;倘若他气量狭小,他会...
JNI静态注册
前言之前其实写过,代码不见了,为了走一下流程,重新简单的写了一个。PS:设计NDK环境配置这里不介绍哈正文静态注册先由Java得到本地方法的声明,然后再通过JNI实现该声明方法。优点: 理解和使用方式简单, 属于傻瓜式操作, 使用相关工具按流程操作就行, 出错率低缺点: 当需...
[摘]adb命令行查询content-provider
偶尔需要使用adb明白改变和查询content-provider中的属性值一、conent 帮助文档如下usage: adb shell content [subcommand] [options]usage: adb shell content insert --uri <URI&g...