前言
很久没有更新博客了,其实并不是因为太忙,也不是遇到的问题不多,是迷茫了,不知道怎么去写,总感觉自己一定会去好好的写文章(哈哈幻想中),但是从来没有动过笔,因为写不好,能力不够。但是还是要去动笔呀!
最近在项目中使用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 ?= null
println(b?.length?:"我错了")
!!. 表示我任性,告诉编译器不要去做非空检查,为空就抛异常
end
到这总结一下kotlin的空安全
声明变量时:在变量后面加问号表示该变量可以为空
调用可空变量时后面加问号表示为空就返回null
!!我不去检查是否为空,如果为空直接抛异常
?:表示为null时为自己去处理返回的结果而不是直接返回null