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


猜你喜欢
- C/C++实现扫雷小游戏源代码:github:https://github.com/KamSss/C-Practice/tree/maste
- 一 前言学习微服务要从基础的架构学起,首先你要有个微服务的概念才能学习对吧!!如果你都不知道啥是微服务,就一头扎进去学习,你自己也觉得自己也
- 前言在日常开发过程中,静态变量和 静态方法 是我们常见的用法,Java中相信大家并不陌生了,那么在 Kotlin 中该如何使用呢
- 要画这种圆形带阴影的头像,个人分解成三个图层1,先画头像边缘的渐变RadialGradient gradient = new RadialG
- 本文研究的主要是优化MyBatis配置文件中的配置的相关内容,具体介绍如下。一、连接数据库的配置单独放在一个properties文件中之前,
- Java自定义异常类的实例详解为什么要自己编写异常类?假如jdk里面没有提供的异常,我们就要自己写。我们常用的类ArithmeticExce
- Fragment的主要意义就是提供与Activity绑定的生命周期回调。Fragment不一定要向Activity的视图层级中添加View.
- 前言本文重点是要将mongodb与spring整合到项目中去,在实践中发现问题,追踪问题,然后解决问题。下面话不多说了,来一起看看详细的介绍
- 一、 * 简介 * 通常通过 * 的方式来执行。 * 的生命周期由IoC容器管理,可以通过注入等方式来获取其他Bean的实例,使用更方便。
- 一对一查询一对一查询的模型用户表和订单表的关系为,一个用户有多个订单,一个订单只从属于一个用户。一对一查询的需求:查询一个订单,与此同时查询
- 本节讲运行在后台服务里的工作请求,如何向发送请求者报告状态。推荐用LocalBroadcastManager发送和接收状态,它限制了只有本a
- Broadcast Receiver简介 Broadcast Receiver是Android的五大组件之一,使用频率也很高。 用于异步接收
- 翻看印象笔记发现自己整理过arraycopy()这样一个方法,码字放到这里:System.arraycopy()是一个静态方法,用来实现重置
- 本文实例讲述了Java实现的上传并压缩图片功能。分享给大家供大家参考,具体如下:先看效果:原图:1.33M处理后:27.4kb关键代码:pa
- 肝了两天,重新整理了下时间工具类,以后我就以该时间工具类进行项目开发了,后会不定期更新功能,也欢迎留言需求,让工具类不断的完善。常量介绍相关
- 一、引言90坦克大战,很经典的一款游戏,当年与小伙伴一人一个手柄,搬上小板凳坐在电视机前,身体时不时跟随手柄摇晃着,时而表情严肃、眉头紧锁,
- /** * Gets the number of cores available in this device, across all pr
- 基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void通
- 本文实例讲述了Android编程实现图片背景渐变切换与图层叠加效果。分享给大家供大家参考,具体如下:本例要实现的目的:1.图片背景渐变的切换
- 概述非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥