Kotlin中空判断与问号和感叹号标识符使用方法
作者:go2coding
最近使用kotlin重构项目,遇到了一个小问题,在Java中,可能会遇到判断某个对象是否为空,为空执行一段逻辑,不为空执行另外一段逻辑,下面这篇文章主要给大家介绍了关于Kotlin中空判断与问号和感叹号标识符处理操作的相关资料,需要的朋友可以参考下
如果有人对程序的崩溃原因做下统计的话,那么由于对象为空,但是又访问了对象的某个属性而导致的崩溃,也许会是程序崩溃的第一大原因了。
比如我们在使用字符串的时候,变量字符串为空的时候,我们去访问了这个字符串变量的长度,结果就导致了程序的崩溃。
后来我们有经验了,在访问对象的属性时,我们都得先做一层对象是否为空的判断,这样我们的程序就变成了这样:
if (str!=null && str.length()>0 && str.trim().length()>0) {}
这样看似非常的严谨,其实非常的冗长,很多代码都是不必要的,而且为了提高程序的稳定性,程序到处都是这用判断。
归根到还是,所有的编译器是没有办法检查出运行时对象是否为空的。
虽然由于访问空变量的属性而导致的程序的崩溃,很大程度上是因为程序员的问题,但是作为编译器或者编程规范,有哪些还可以提升的 地方呢。
Kotlin
在变量的属性上,把变量分为可空变量和不可空变量。
我们平时声明的变量都是不可空变量,对于不可空变量一开始就需要进行赋值,否则会出现如下的错误:
变量没有赋值:
var str:String
var len = str.length
错误提示:
Variable 'str' must be initialized
如果声明一个可空的变量,一开始可以先不赋值,当一个空对象在访问了一些属性后,会报错。
var strn:String? =null
println(strn.length)
那就会报如下的错误:
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
Kotlin
在空判断为我们做了这个新特性,但是还是得靠程序员,程序员的科学使用,才能最好的保证程序的稳定性。
!! 运算符
Kotlin
帮我们空对象做了一些处理,对于一些可控的对象,Kotlin
在访问某些属性是,如果对象是空的,即使访问了某些属性也不会直接崩溃,而是返回空对象。
如果我们不确定对象有没有值时,我们可以这样来访问属性:
var strn:String? =null
var len = strn?.length
你可以理解这个?
,是我们对这个变量的不确定。
如果你对这个变量很有信心,同样的,你也可以加上两个!!,进行强调说你非常的确认他不是空的。
var strn:String? =null
var len = strn?.length
strn = "1231"
println(strn!!.length)
如果你怎么有信心,你可以使用let
关键字。