Kotlin中的一些判空操作、空安全
前言
很久没有更新博客了,其实并不是因为太忙,也不是遇到的问题不多,是迷茫了,不知道怎么去写,总感觉自己一定会去好好的写文章(哈哈幻想中),但是从来没有动过笔,因为写不好,能力不够。但是还是要去动笔呀!
最近在项目中使用kotlin了之前也学了点,但是写起来还是很费力,被kotlin的判空操作搞的头昏脑胀的,这里整理一下。
Kotlin 校验字符串空值
- isNullOrEmpty:为空指针或者字符串长度为0时返回true,非空串与可空字符串都可以调用
- isNullOrBlank: 为空指针、字符串长度为0,或者全为空格时返回true,也是非空字符串和空字符串都可以调用。
- isEmpty:字符串长度为0时返回true,只有非空字符串可以调用
- isBlank:字符串长度为0或者全为空格时返回true,只有非空字符串可以调用
- isNotEmpty和isNotBlank和上面的语法基本上是类似的
细心的朋友会发现每个判断空值的后面会有“非空字符串与可空字符串都可以调用”或是“只有非空字符串可以调用”,这个也正是我这个从Java过来的人头疼的地方:变量是我声明的我哪知道它是不是为空,我也不用管它是否被赋空值了呀。难道kotlin有什么神秘操作?
是的,现实是Java定义一个变量时不会去考虑这个变量接收的具体值是否为空(null),用惯Java的人可能不会觉得这个有什么不好,虽然它不知道什么情况下可能为空,但是我可以自己去规避,常规操作是:
if(a!=null){
}
或者
try{
text.setText(a)
}catch(Exception){
......
}
1,去判空。 2,去抛异常处理。
kotlin想既然你接收空值后,很多情况下还是要去处理不为空的情况,那我为什么不在定义变量的时候就去设置这个变量是否可以为空,于是呼kotlin说:我要来个空安全,声明变量的时候就让开发者去控制这个变量是否可以为空。
空安全
上面我们提到了校验字符串区分空字符串和非空字符串,这是因为kotlin引入了空安全这个概念,每个变量分为可空和不可空两种类型,它就要求你必须在定义变量的时候就声明该对象,于是写惯Java的就经常遇见它
property must be initialized or be abstract
Java可不会强制让你去初始化一个变量
but kotlin:
声明不可为null的字符串
var name : String =""
可以为null的字符串
var name :String?
写惯Java的人看到后
是的Java和kotlin语法有本质上的区别,kotlin定义变量的时候比Java更“严格”,它不仅要求这个变量是否可以再次被赋值(val、var)同时要求这个变量是否可以为空。
回到我们的空处理:所以kotlin在判断空的问题上分为六种情况,如果你定义一个可空的变量此时你使用isNotEmpty、isBlank去判断的时候编译器便会报错
是的它在告诉你想用我先给我一个初始化值,因此在定义一个变量的时候一定要去考虑一下我创建的这个变量是否需要去处理空的情况
到这我又有疑问了,既然声明时要求是否为空,那我要是定义一个非空的我给他赋值一个可空的变量会出现什么情况?或者说那样操作的话kotlin会如何去处理。说干就干,首先咱定义几个变量
val a:String = "我加小明"
val b:String ?= null
val c:String? = "我加小明"println(a.length)println(b.length)println(c.length)
一个不为空的变量,两个可以为空的,我们来打印它门的长度:
什么鬼,我获取你长度怎么还不行,到这可能会有人说:真香!因为你用Java去获取一个未知字符串的长度时,如果考虑不周直接b.length(),一顿操作猛如虎直接运行报错了,因为你这个变量是为null但是编译器不会去检查,而kotlin很直接的告诉你:你定义了一个可以为空的对象,所以你直接获取长度的时候不可以的 !!!
那怎么办,或者有人任性我就想这么写,我们看到编译器给了提示:?.和!!.
?.和!!.
其实kotlin是非常人性话的,你定义了一个可为空的变量但是你依然可以去操作的。我们修改一下上面的写法:
val a:String = "我加小明"
val b:String ?= null
val c:String? = "我加小明"println(a.length)println(b?.length)println(c!!.length)
这样编译就通过。
这里的**?.**就是相当于Java的如果为空就返回null 而kotlin强制让我们去处理,这样就避免了很多空指针异常
if(b==null) return null;
当然如果你不想直接为null,你说当为空时我想自己去处理,kotlin还有语法**?:**
val b:String ?= nullprintln(b?.length?:"我错了")
!!. 表示我任性,告诉编译器不要去做非空检查,为空就抛异常
end
到这总结一下kotlin的空安全
声明变量时:在变量后面加问号表示该变量可以为空
调用可空变量时后面加问号表示为空就返回null
!!我不去检查是否为空,如果为空直接抛异常
?:表示为null时为自己去处理返回的结果而不是直接返回null
Kotlin中的一些判空操作、空安全相关推荐
- Java 中的判空操作
equals与==的区别 一.String 的 isEmpty() 与 null 与 "" 区别 public class demo {public static void mai ...
- Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:
当需要对一个LIst进行判空操作时我们可使用如下两个语句: if (list == null || list.size() == 0) {} if (list != null && l ...
- Kotlin中的空判断
Kotlin中的空判断 前言 字符串空判断 空字符串:"" 纯空格字符串:" " null字符串:null 值为null字符串:"null" ...
- java 中的多种判空方式
前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^. 而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! java 中的多种判空方式 1 ...
- Kotlin——初级篇(六):空类型、空安全、非空断言、类型转换等特性总结
在我们熟知的Java中,定义一个变量可以默认不赋值,因为Java的系统会给我们默认赋一个默认值,并且Java可定义一个赋值为null的变量,这样在使用这个变量的时候都会去显示判断该变量是否为null. ...
- 数据类型Map判空 、空字符串、空key值等各种判断方法,全网最详细
Map集合对于开发人员来说,除了JSON以外,这种key,value存储的方式最熟悉不过了,做项目的过程中,会高频用到Map的数据结构.在业务逻辑层处理中,往往会对Map数据类型进行一些判空的处理,自 ...
- java中如何限制输入非空_项目中的参数限制、非空、以及集合中的验证,你真的会做吗(Java)...
背景: 在项目管理中,我们通常要对一个个参数做验证, 前端校验,后端加校验,这里为了保证校验的一致性,我们需要将我们的校验写的比较高效率一点,不至于满篇都是is null的进行参数验证,为了成为一个成 ...
- 6月14 空控制器和空操作及命名空间
空操作和空控制器处理 空操作:就没有指定的操作方法 空控制器:没有指定控制器 1.空操作:(Admin是不存在的) 一般网站处于安全考虑不给用户提示任何错误信息 "空操作"本质意思 ...
- 苹果手机连接电脑服务器传文件,还在羡慕苹果电脑隔空操作?windows的这个骚操作,3秒即可传文件...
佳乐说资源,专注好资源!大家好我是佳乐,今天我给大家分享的是:如果对文件进行隔空操作! 通过一些非常简单的设置,我们可以把自己的windows或者苹果电脑作为一个共享设备,我们可以使用手机或者电脑,来 ...
最新文章
- MyEclipse部署Web项目Servers报错:NullPointerException at com.genuitec.eclipse.ast.deploy.core.Deployment
- 《c语言从入门到精通》看书笔记——第5章 常用的数据输入输出函数
- 【数据结构】量子危机
- Lambda运行时内部:窥视无服务器巢穴
- 2017年计算机三级网络技术试题,2017年计算机三级网络技术考前试题及答案(8)
- 新手算法学习之路----二分法Last-position-of-Target
- 互联网日报 | 4月25日 星期日 | 我国首辆火星车命名为“祝融”;哈啰出行正式递交招股书赴美上市;快手搜索月活超2.5亿...
- 一天一个小技巧(4)——利用Python和MATLAB进行图片二值化
- 【速达软件】【速达3000】新账套导入旧账套资料SQL
- 放弃 TSLint,使用 ESLint
- oracle 逗号,查询oracle中逗号分隔字符串中所有值
- android 模拟xp,使用Bochs模拟器瞬间安卓变XP教程
- android 五种存储方式,android数据五种存储
- python在教育领域的应用课题_研究型案例在Python教学方法中应用
- linux下罗技摄像头采集图片,网络摄像头罗技和Linux
- 【转】24个GE SFP/10 GE SFP+端口是什么意思
- C++:66---特殊工具与技术之(不可移植的特性:位域、volatile、extern “C“链接提示)
- 米家扫地机器人怎么加水_扫地拖地一次就好,米家扫拖机器人1C体验
- 天津理工计算机学院调剂,2019年硕士研究生调剂通知
- Tensorflow catdog-checkpoint