Kotlin中空判断与问号和感叹号标识符使用方法

作者:go2coding 时间:2022-11-12 13:48:04 

如果有人对程序的崩溃原因做下统计的话,那么由于对象为空,但是又访问了对象的某个属性而导致的崩溃,也许会是程序崩溃的第一大原因了。

比如我们在使用字符串的时候,变量字符串为空的时候,我们去访问了这个字符串变量的长度,结果就导致了程序的崩溃。

后来我们有经验了,在访问对象的属性时,我们都得先做一层对象是否为空的判断,这样我们的程序就变成了这样:

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关键字。

var myText:String? = null
       myText = "hello let"
       myText?.let {
           var tv_text: TextView = findViewById(R.id.tv_test) as TextView
           tv_text.text = myText
       }

myText null ,是不会进入let 里面的函数的,相当于他帮助我们判断了是否为空的动作。写起来是不是简单多了,在程序中如果不确定的变量就引用let 会减少很多程序的崩溃问题。

小结

程序中崩溃的原因,大部分是我们访问了一个空变量,这时候程序就退出了,这当然是程序员的不小心导致的,但是对于语言,可以帮我们先做检验,或者把编译器写的智能点,别让程序员经常犯这些错误。Kotlin 帮我们做了很多,如果再次碰到 ?? 和!!的运算符,我们就好理解了。

来源:https://blog.csdn.net/weixin_40425640/article/details/127841729

标签:Kotlin,空判断,感叹号,问号
0
投稿

猜你喜欢

  • Android实现多个连续带数字圆圈效果

    2021-09-10 02:46:23
  • Java OpenCV4.0.0实现实时人脸识别

    2023-11-16 07:29:14
  • Java去掉数字字符串开头的0三种方法(推荐)

    2022-05-31 08:04:41
  • 浅谈C#与Java两种语言的比较

    2023-09-26 13:05:19
  • C#开发中的垃圾回收机制简析

    2022-08-06 14:10:56
  • Java的Struts框架简介与环境配置教程

    2023-10-29 05:23:03
  • C# winform程序读取文本中的值实例讲解

    2023-03-17 21:36:51
  • Android开发基础简化Toast调用方法详解

    2022-02-11 00:44:09
  • 谈C# using的用法与好处

    2022-02-10 08:20:01
  • Android操作系统之内存回收策略

    2021-09-26 06:38:01
  • 一文带你搞懂Redis分布式锁

    2021-09-26 12:56:14
  • Java Socket 编程详解

    2022-06-13 12:06:57
  • Android Studio真机无线连接USB设备调试运行详解流程

    2023-12-13 00:37:37
  • java实现省市区转换成树形结构

    2022-11-27 03:43:37
  • 使用SpringMVC的@Validated注解验证的实现

    2023-09-20 19:49:55
  • 一篇文章带你入门Java变量

    2021-09-21 07:46:02
  • java中public class与class的区别详解

    2023-04-09 11:49:40
  • c# 基于wpf,开发OFD电子文档阅读器

    2023-09-08 00:10:02
  • RedisTemplate中opsForValue和opsForList方法的使用详解

    2023-07-28 15:48:57
  • java中的Object类的toSpring()方法

    2022-08-30 12:36:03
  • asp之家 软件编程 m.aspxhome.com