Kotlin空安全空类型浅谈
作者:听着music睡 发布时间:2022-06-18 22:48:49
标签:Kotlin,空安全,空类型
首先非空变量和可空变量的区别:
// name为不可为空的变量, 不能赋值为null ,若有判断 if(name==null) 无意义,因为肯定不为null
var name : String = ""
// role 为可空变量
var role : String? = ""
非空变量赋值为Null为报如下错误:
一、判断可空变量是否为null的方式
1、
var name : String ?= ""
if (name == null){
Log.i(Tag,"name==null")
}else{
Log.i(Tag, "name!=null")
}
2、
?.的意思为若name为null 。则返回null
var name : String ?= "abc"
Log.i(Tag,"name="+name?.length)
二、涉及到返回可空值的函数使用方法,在返回类型后同时加?
var name:String?="abc"
fun getNameLength():String?{
return name
}
三、let操作符
用法:变量?.let{ ... } , 作用为忽略null的情况
例如筛选出一个集合非空的元素集合
常规写法:
fun logUnNullList(arr:Array<String>):Unit{
for (item in arr){
if (arr==null){
continue
}else{
Log.i(Tag,"非空元素为->"+item)
}
}
}
用let操作符写法:
fun logUnNullList(arr:Array<String>):Unit{
for (item in arr){
item?.let {Log.i(Tag,"非空元素为->"+item) }
}
}
四、Evils操作符(?: !! as)
1、?:
对于一个可空变量的使用,若当该变量为空的时候赋予一个特定值使用
var name:String?="abc"
var nameLength:Int = 0
nameLength = name?.length?:-1 // 取name的length ,若name为null,则nameLength的值为-1
这样要比传统写法 if(name==null) -1 else name.length 要简介
2、!!
在一个可空变量使用的时候后面加上!! ,则当该变量为null的时候抛出空指针异常
var name:String?=null
nameLength = name!!.length
此时name为null ,因为使用了!! ,则抛出空指针异常
3、as、as?
类型转换
当使用as的时候若类型转换失败则抛出类型转换(ClassCastException)异常
当使用as?的时候若类型转换失败则返回null,不会抛出异常
var name:String?= 12 as String
可见12 转换String 类型异常
当使用as?的时候
var name:String?= 12 as? String
Log.i(Tag,"name="+ name)
// 打印日志: name=null
总结:
抛出异常的 !! as 尽量少用,用as? ?. ?: let来代替
来源:https://cloud.tencent.com/developer/article/1928312
0
投稿
猜你喜欢
- java的构造函数是一个非常重要的作用,首先java里的构造函数是可以重载的,而且因为也是可以继承在父类的构造函数,所以在子类里,首先必然是
- 一、简介  本文今天主要是讲Redis中对过期key的监听,可能很多小伙伴不会,或者使用会出现一些不可思
- 本文实例讲述了应用Java泛型和反射导出CSV文件的方法。分享给大家供大家参考。具体如下:项目中有需求要把数据导出为CSV文件,因为不同的类
- 使用方法:先把mvcpager.dll引用加入mvc项目中。前台代码前台:@{Layout = null;}@using Webdiyer.
- 问题遇到问题:在前后端分离跨域访问的项目中shiro进行权限拦截失效 (即使有正确权限的访问也会被拦截) 时造成302重定向错误等问题报错:
- SpringBoot配置文件中设置server.port不生效我的配置文件为:# application.ymlserver:
- 方案一.使用国内的镜像阿里仓库等首先通过maven的路径找到setting.xml的文件然后在其中修改mirror和profile保存一下就
- 上一节是把大概的流程给过了一遍,但是还有很多地方没有说到,后续的慢慢会涉及到,敬请期待!这次我们说说垃圾收集器,又名gc,顾名思义,就是收集
- java控制台输出图书馆管理系统(只用java代码不用数据库和GUI,java入门的新手秒懂)在个项目中,我只用数组保存数据,和只用for循
- 前言异步调用几乎是处理高并发,解决性能问题常用的手段,如何开启异步调用?SpringBoot中提供了非常简单的方式,就是一个注解@Async
- 前言我们通常使用Spring boot做项目搭建的基础框架,必然少不了它的内置日志框架Logback,在spring-boot-starte
- 现在有好多扫描识别银行卡号的SDK都是收费的,但是也有不收费的,但是有一定的问题,就是那种印刷的银行卡号扫描不出来,希望哪位大神指导原因给解
- 本文实例为大家分享了SpringMVC按Ctrl上传多个文件的具体实现代码,供大家参考,具体内容如下JSP页面注意:必须加入multiple
- 之前一直使用各种报表工具,如RDLC、DevExpress套件的XtraReport报表,在之前一些随笔也有介绍,最近接触锐浪的Grid++
- 上篇文章给大家介绍了在idea中将创建的java web项目部署到Tomcat中的过程图文详解,可以参考下,本文给大家继续介绍如何在IDEA
- 此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法。 提到'权限管理和设计
- SpringBoot 配置SwaggerUI 访问404的小坑。在学习SpringBoot构建Restful API的时候遇到了一个小坑,配
- 报错:Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLeni
- 一、java端首先我使用的是java自带的对webservice的支持包来编写的服务端和发布程序,代码如下。webservice的接口代码:
- 1.效果图如下:2.controller层代码:import java.util.HashMap;import java.util.Map;