Kotlin空值处理简介

Android  Kotlin  2024年9月21日 am9:03发布2个月前更新 91es.com站长
77 0 0

前言

简单记录一下Kotlin变量空值处理的方式。记录于此方便自己查阅。

正文

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时,调用该变量中的成员方法或属性的返回值,其语法格式为“表达式?:表达式”。

  1. 如果左侧表达式非空,则返回左侧表达式的值,否则返回右侧表达式的值。

  2. 当且仅当左侧为空时,才会对右侧表达式求值。

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时,不能继续调用变量中的方法或属性。

参考文章

  1. 《Kotlin从基础到实战》

 历史上的今天

  1. 2021: 刘大白:心上的写真(0条评论)
  2. 2019: 希区柯克:机舱里的钟声(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Android消息机制之三Handler分析

接着《Android消息机制之一简介(1)》和《Android消息机制之二简介(2)》,我们现在来单独看看Handler源码。设计代码的路径:base\core\java\android\os\Handler.javaHandler的简单使用在项目中,Handler的声明和初始化一般...

莫言:陪女儿高考

那天晚上,带着书、衣服、药品、食物等诸多在这三天里有可能用得着的东西,搭出租车去赶考。我们很运气,女儿的考场排在本校,而且提前在校内培训中心定了一个有空调的房间,这样既是熟悉的环境,又免除了来回奔波之苦。信佛的妻子说这是佛祖的保佑啊!我也说,是的,这是佛祖的保佑。坐在出租车上,看到车牌照上的号码尾...

梁漱溟:花点心思活着,人生才有意义

一人们常常爱问:人生有没有目的?有没有意义?不知同学们对于这一类的问题想过没有?如果想过,其答案为何?要是大家曾用过一番心思,我来讲这问题就比较容易了,你们就可以比较容易地了解我的话。我以为人生不好说目的,因为目的是后来才有的事。我们先要晓得什么叫做目的。比如,我们这次来兴安,是想看灵渠,如果我...

刘瑜:适应孤独,就像适应一种残疾

前两天有个网友给我写信,问我如何克服寂寞。她跟我刚来美国时一样,英文不够好,朋友少,一个人等着天亮,一个人等着天黑。“每天学校、家、图书馆、健身房,几点一线。”我说我没什么好招儿,因为我从来就没有克服过这个问题。这些年来我学会的,就是适应它。正如有人所言:“适应孤独,就像适应一种残疾。”我觉得,...

肖复兴:荔枝

我第一次吃荔枝,是28岁的时候。那是十几年前,我刚从北大荒回到北京,家中只有孤零零的老母。站在荔枝摊前,脚挪不动步。那时,北京很少见到这种南国水果,时令一过,不消几日,再想买就买不到了。想想活到28岁,居然没有尝过荔枝的滋味,再想想母亲快70岁的人了,也从来没有吃过荔枝呢!虽然一斤要好几元,挺贵的,...

柴静:真实的人性有无尽的可能

1几年前我采访过一个人。他被诬陷嫖妓,证据是卖淫者的供述,他被拘留了42天,放了。校长当不了了,儿子的婚事也吹了“他爹是个大流氓,人还能好么?”他告了十六年,路上带不了两个钱还叫人掏包了,捡人家饭吃。我问他最难受的是什么。“最难忍受就是开党员会的时候我不是党员了”他说。2我们找到了当...