Kotlin空值处理简介

Android  Kotlin  2024年9月21日 am9:03发布2小时前更新 91es.com站长
5 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、 本站内容: 部分来源于网络,仅供站长学习和参考,若侵权请留言

暂无评论

暂无评论...

随机推荐

Android设备adb screenrecord录屏简单使用

前言Android测试有些现象无法用语言描述或者描述不清晰,因此会要求测试拍视频或者录屏,方便工程师解决问题。偶尔需要录像,因此这里整理一下adb screenrecord的使用,方便自己查阅和学习。好记性不如烂笔头正文screenrecord 命令规则screenrecord [op...

Android FileObserver对文件或文件夹监听

前言Android有个抽象类FileObserver,看名字就知道对文件监听。用于监听文件访问、创建、修改、删除、移动等操作的监听。本文有参考其他文章整理,以及自己亲自写demo验证。好记性不如烂笔头正文FileObserver简介FileObserver 是个抽象类,需要继承才可以使...

《MySQL基础教程》笔记9

前言主要是介绍PHP中正则表达式的介绍等。根据《MySQL基础教程-西泽梦路》学习,简单的做一下笔记。记录于此,方便自己回忆。正文require_once看其名字,就是请求一次,这很常用。require_once(文件名);正则表达式什么是正则表达式正则表达式是一种用于描述字符...

叔本华:比读书更重要的是什么

不管任何藏书丰富的图书馆,假如不加整顿杂乱无章的话,它给予我们的利益还不如那些规模小藏书少,但整理得条理井然、分类清楚的图书馆,同理,不管你学识如何的渊博,如若不能反复思维咀嚼消化的话,它的价值,远逊于那些所知不多但能予以深思熟虑的知识。何以言之?因为我们若要将所学得的知识消化吸收,变为己有,并且能...

Android调试,删除adb devices显示的多余设备

前言最近在Android 9.0的设备上调试,发现无缘无故多处一个设备中,导致一直无法连接机器。重启机器无效重启笔记本有效最近在网上看到,其实不用重启笔记本也可以解决。记录于此,方便自己查阅。正文现象在cmd界面输入adb devices就C:\Users\water>...

常用Linux命令摘抄之一

推荐使用 读书导航 极客导航 :125啦极客导航(http://www.91es.com/jike.html)1、man man的含义是manual,即手册。当我们不清楚Linux命令作用和用法时, 可以使用man command进行查询,command为具体的命令名称。 ...