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

 更新时间:2022年12月06日 14:24:05   作者: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关键字。

        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 帮我们做了很多,如果再次碰到 ?? 和!!的运算符,我们就好理解了。

到此这篇关于Kotlin中空判断与问号和感叹号标识符使用方法的文章就介绍到这了,更多相关Kotlin空判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android编程设计模式之责任链模式详解

    Android编程设计模式之责任链模式详解

    这篇文章主要介绍了Android编程设计模式之责任链模式,详细分析了Android设计模式中责任链模式的概念、原理、应用场景、使用方法及相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • Android线程间通信Handler源码详解

    Android线程间通信Handler源码详解

    这篇文章主要为大家介绍了Android线程间通信Handler源码示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android实现长图展开与收起效果

    Android实现长图展开与收起效果

    这篇文章主要为大家详细介绍了Android实现长图展开与收起效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Android开发之ContentProvider的使用详解

    Android开发之ContentProvider的使用详解

    本篇文章介绍了Android开发之ContentProvider的使用详解。需要的朋友参考下
    2013-04-04
  • Kotlin 协程的异常处理准则

    Kotlin 协程的异常处理准则

    协程是互相协作的程序,协程是结构化的,正是因为协程的这两个特点,导致它和 Java 的异常处理机制不一样,这篇文章重点给大家介绍Kotlin 协程的异常处理准则,感兴趣的朋友一起看看吧
    2024-01-01
  • Android实现图片加载进度提示

    Android实现图片加载进度提示

    这篇文章主要为大家详细介绍了Android实现图片加载进度提示,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Android实现调用摄像头拍照与视频功能

    Android实现调用摄像头拍照与视频功能

    这篇文章主要为大家详细介绍了Android实现调用摄像头拍照与视频功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Android ListView在Fragment中的使用示例详解

    Android ListView在Fragment中的使用示例详解

    这篇文章主要介绍了Android ListView在Fragment中的使用,因为工作一直在用mvvm框架,因此这篇文章是基于mvvm框架写的,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • Android手机拍照或选取图库图片作为头像

    Android手机拍照或选取图库图片作为头像

    这篇文章主要介绍了Android手机拍照或选取图库图片作为头像的相关资料,需要的朋友可以参考下
    2015-06-06
  • 一文详解如何在Flutter中使用导航Navigator

    一文详解如何在Flutter中使用导航Navigator

    一个APP如果没有页面跳转那么是没有灵魂的,页面跳转的一个常用说法就是Navigator。那么在flutter中如何使用Navigator呢?本文就来和大家详细聊聊
    2023-02-02

最新评论