首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Kotlin】空安全 ① ( Kotlin 的空安全机制 | 变量可空性 | 默认变量不可赋空值 | 声明可空类型变量 )

文章目录 一、Kotlin 的空安全机制 二、变量可空性 1、默认变量不可赋空值 2、声明可空类型变量 一、Kotlin 的空安全机制 ---- Java 中的空指针问题 : 在 Java 语言...编写的程序中 , 出现最多的崩溃就是 NullPointerException 空指针异常 , 该异常是 运行时 才爆出的 , 在 代码编写时 以及 编译期 很难提前排查出来 ; Kotlin 的空安全机制...Kotlin 程序的 代码健壮性 ; 二、变量可空性 ---- 1、默认变量不可赋空值 在 Java 中 , 引用类型的变量 默认为 null 空值 ; 但是在 Kotlin 中 , 变量默认不可为...null 空值 , 这样所有的 变量 在默认状态下 , 都有一个 默认的实例对象 , 从而极大的 减少了 空指针异常 出现的概率 ; 代码示例 : 先定义一个 name 变量 , 为其赋值字符串 "Tom...赋值一个空值 , 除非 将该变量声明为 可空类型 ; 2、声明可空类型变量 声明可空类型变量 : 如果要声明一个 可空类型的变量 , 必须 声明该变量的具体的类型 , 并在该类型后添加 ?

1.9K20

【Kotlin】空安全总结 ( 变量可空性 | 手动空安全管理 | 空安全调用操作符 | 非空断言操作符 | 空合并操作符 | 空指针异常处理 | 先决条件函数判空 )

文章目录 一、Kotlin 的空安全机制 二、变量可空性 1、默认变量不可赋空值 2、声明可空类型变量 三、手动空安全管理 四、空安全调用操作符 ?...编译期 , 就可以 提前排查出可能出现的空指针异常问题 , 并提前进行处理 , 这样极大地提高了 Kotlin 程序的 代码健壮性 ; 二、变量可空性 ---- 1、默认变量不可赋空值 在 Java...中 , 引用类型的变量 默认为 null 空值 ; 但是在 Kotlin 中 , 变量默认不可为 null 空值 , 这样所有的 变量 在默认状态下 , 都有一个 默认的实例对象 , 从而极大的 减少了...String 这是因为 var name 变量 默认为非空的 , 在 Kotlin 中 不允许将 默认变量 赋值一个空值 , 除非 将该变量声明为 可空类型 ; 2、声明可空类型变量 声明可空类型变量...: "name 变量为空" 返回的是 "name 变量为空" 值 , 打印出来的就是 name 变量为空 内容 ; 之后 为 name 变量赋值 "Tom" 字符串值 , 现在 name 变量不为空 ,

1.8K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Kotlin入门(8)空值的判断与处理

    然而,饶是有经验的开发者,尚且摆脱不了如影随形的空指针,何况编程新手呢?问题的症结在于,Java编译器不会检查空值,只能由开发者在代码中增加“if (*** !...Kotlin的研发人员当然不会放过这点,就像读者在上一篇文章中看到的那样,Kotlin通过isNullOrBlank函数进行空值校验,下面列出Kotlin校验字符串空值的几个方法: isNullOrEmpty...注意到上面的方法有区分非空串与可空串,这是缘于Kotlin引入了空安全的概念,每个类型的对象都分作不可为null和可以为null两种。...前面的文章中,正常声明的对象默认都是非空(不可为null),比如下面这个声明字符串变量的代码 var strNotNull:String = "" 非空对象要么在声明时就赋值,要么在方法调用前赋值...表示对象为空时就直接返回null,所以返回值的变量必须被声明为可空类型 length_null = strB?.

    4.4K10

    Better Kotlin

    这意味着你不允许明确声明为 val,它就不能保证它是不可变的。 对于普通变量来说,「不可变」和「只读」之间并没什么区别,因为你没办法复写一个 val 变量,所以在此时却是是不可变的。...我们可以通过以下解决方法来减少生成的字节码: 对于基本类型和字符串,可以使用 const 关键字将常量声明为编译时常量。 对于公共字段,可以使用 @JvmField 注解。...LazyThreadSafetyMode.PUBLICATION:多个线程会同时执行,初始化属性的函数会被多次调用,但是只有第一个返回的值被当做委托属性的值。...7 注意 Kotlin 的可空和不可空 最近闹了一个笑话,在项目中需要写一个上传跳绳数据的功能。于是有了下面的代码。...仔细一看,发现 Java 编写这个接口的时候,会被认为这个参数 "data" 对应的 "value" 是可以为 null 的,而改为 Kotlin 后,由于 Kotlin 默认不为空的机制,所以需要的参数是一个不可以为

    1.3K20

    kotlin基本语法

    java的各种痛点而产生的,利用kotlin可以大大减少开发过程中的代码量编写,有一套几乎可以杜绝空指针的机制,kotlin没有分号 二、如何运行Kotlin代码 郭霖大神这本第三行代码是在...fun main (){ prinln("hello world") } 三、编程之本:变量和函数 变量 val a //a声明为不可变的 var b//b声明为可变的 为了保证程序中变量的稳定...函数体} 最后一行代码作为函数的返回值 Java函数式API的使用 与后面android sdk 接入有关,不过目前还没怎么看懂,用到了再说 七、空指针检查 可空类型系统 kotlin...默认所有变量都不可为空 类型?...//强制判断非空 let//就不太明白 八、kotlin的小魔术 字符串内嵌表达式 利用$进行内嵌,解决java字符串拼接时一堆加号和分号的痛点 val a = "22" val b = "67

    59030

    Kotlin学习之路(2)数据类型

    这样Kotlin将该变量或表达式的值嵌入到该字符串中 var Price : Double= 88.0 var s = "图书的价格是:${Price}元" 【数组–暂时先了解】 暂时先了解一下,在【集合...,我们只要把这个int 换成long float double 即可,但是在Kotlin中这么玩是不可以的,Kotlin的数组声明 var int_array:IntArray = intArrayof...在Kotlin中也可以通过下标的方式获取对应的元素,不过Kotlin要比Java多出两个方法 get set,通过get获取元素的值,通过set方法修改元素值,感觉就像在操作ArrayList队列一样...就是一个可空类型,这种类型可以接受Int值和null;而Int类型只能接收Int值不能接受null。...☆ 只有可空的变量或常量才能接受null,非空类型的变量或常量不能接受null var aStr: String = "kit" var bStr: String?

    78120

    Kotlin----控制语句

    1、条件分支 (1)、简单分支–if…else kotlin 中 if…else 语句具有返回值,类似于Java中的三目运算 //传入两个值 a 和 b , 将大值显示在TextView控件中 nameTextView.text...kotlin中默认变量非空,如果需要声明一个可空的变量,则在类型后面追加一个问号?...(3)、校验空值的运算符——?、?:、!! ​ ? 表示可空,如果空直接返回null ​ ?: 表示一旦为空返回冒号后面的值,否则返回正常的值 ​ !! 表示断言非空(放弃非空判断)。...断言时得到的属性值长度为$length" } 4、等式判断 (1)、结构相等 kotlin中使用 == 判断两个数据是否相等,使用 != 判断是否不相等。...Java中使用equals() kotlin中比较字符串时不再比较在内存中的存储地址,而是直接比较变量值 ,这种方式就被叫做 结构相等,即模样相同/外观相同。

    61620

    类型声明与空安全(Void Safety)

    在 Kotlin 中,不可能为空的变量和可能为空的变量被强行分开了(Java 有 @Nullable 和 @NonNull 注释,但只会提供警告)。那 Kotlin 为什么要这样设计呢?...Kotlin 非空类型/可空类型(NonNull/Nullable)声明 最开始时我们提到:在 Kotlin 中,不可能为空的变量和可能为空的变量被强行分开了。具体是怎么分开的呢?...Kotlin 可空(Nullable)的传递性 如果一个可空对象调用了方法,因为这个方法有可能不被执行,那么如果我们接收它的返回值,那么返回值的类型应该是什么呢?...所以,可空是具有传递性的。 双叹号由于在变量为空时会抛出异常,所以它的返回值就还是为 Int,因为抛了异常的话,后面的代码已经不会被执行了。...回到场景 如果用 Kotlin 来实现场景中的代码,只需要将 mAudioPlayer 声明为可空类型就可以了: PlayerController.kt: /** * 用户音频 ugc 播放器。

    1K50

    干货|Kotlin入门第一课:从对比Java开始

    第1行,编译错误,kotlin规定如果显式指明了str1的类型,这里是String,声明时必须同时指定是否允许为空值(null),不加问号”?”...解释完变量定义时关于空的概念,接下来就该看看这种保护机制能否真的让我们省心。就拿获取字串的长度为例,Kotlin中String类有个length属性,即调用方式为strObject.length。...所以,String类型但允许为null的才需要我们关注,因为这时候有可能出现运行时异常。 对于声明为String?的变量,访问属性时会涉及到问号和双感叹号两个操作符(”?”和”!!”)...length: " + str2.length) //print 8 14 } 第2行,编译错误,因为之前只是将str2声明为可以是null同时赋值为null,所以紧接着访问其length属性是不允许的...属性; 第5-7行,不会执行到if代码块中,这里用了类似Java中的做法; 第9行,输出”8″,到这里,相比能体会到Kotlin的智能之处了,在第八行对str2赋值之后,就不会再像第二行那样报编译错误了

    1K110

    【Kotlin】空安全 ② ( 手动空安全管理 | 空安全调用操作符 ? | let 函数结合空安全调用操作符使用 )

    三、let 函数结合空安全调用操作符使用 一、手动空安全管理 Kotlin 语言中 , 变量类型 分为 可空类型 和 非空类型 , 默认状态 下 , 变量是 非空类型 的 , 如果使用 类型?...将变量声明为 可空类型 , 那么就需要使用 手动安全管理 ; 代码示例 : 在下面的代码中 , 将 name 变量声明为了 String?...二、空安全调用操作符 ? 在 Kotlin 语言中 , 调用 可空类型变量 的 成员 时 , 可以使用 " 安全调用操作符 " 也就是 ? 进行调用 , 使用格式如下 : 可空类型变量?....成员 使用了 安全调用操作符 之后 , 在调用变量成员前 , 会自动进行 空值检查 , 如果该变量为空 , 则会 跳过后面的 成员调用 , 继续执行下一行代码 ; 代码示例 : 在下面的代码中 , 调用.../ 闭包 的含义是 , 如果 name 变量 字符串非空白, 将其转为首字母大写 , 并返回 , 如果 name 变量 字符串为空白, 设置 Hello 值为返回值 ; fun main() {

    61420

    浅谈Kotlin(六):lateinit、by lazy 使用

    Kotlin中有两种延迟初始化的方式。一种是lateinit var,一种是by lazy。...一、lateinit的使用 按Java的写法,此时即代表datas默认为null,但是因为Kotlin的非空机制,这里给出了两种选择,要不给一个初始值,要不增加lateInit修饰 则可以这么写:...*/ 也可以这么写: 表示我先不给一个初始值,编译期的时候也无需进行非空判断,后面我会找时机给他赋值 即late的作用为编译期在检查时不要因为属性变量未被初始化而报错 lateinit var datas...property datas has not been initialized lateinit使用限制: 只能用来修饰类属性,不能用来修饰局部变量, 只能用来修饰对象,不能用来修饰基本类型(因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值...时再进行初始化 打印结果: lazyParm初始化 lazyParm->aaa by lazy使用限制: 要求属性声明为val,即不可变变量,在java中相当于被final修饰。

    5.8K32

    Android平台的Swift—Kotlin

    kotlin中的可变集合对Java的集合进行了包装,同时它实现了一套不可变集合库。 [12.png] 访问: [13.png] 6、伴生对象 Kotlin中没有静态属性和方法。...[16.png] ----- 二、新特性 1、空安全 Kotlin是如何实现空安全的呢? 在Kotlin中,对象声明分为可空引用和非空引用两种。...这就在编译期间杜绝了空指针异常。但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。...3、字符串模板 表示字符串中可以包含变量或者表达式,以$符号开头(这跟JSP的EL表达式有点像),比如: [22.png] Kotlin中是通过单引号进行转义的 [23.png] 4、操作符重载 Kotlin...2)Kotlin中的反射: [36.png] 可以不通过KClass对象,直接调用方法和访问属性(注意:如果有重载的函数或同名的属性不能使用以下方式)。 [37.png] 4、协程 什么是协程?

    3.5K90

    小谈 Kotlin 的空处理

    可接受 null,而 var time: Long 则不能接受 null。 在变量传递阶段,必须保持“可空性”一致,比如形参声明是不为空的,那么实参必须本身是非空或者转为非空才能正常传递。...,后端没传该值就会抛出空指针异常。 2. 过分依赖 Kotlin 的空值检查 private lateinit var mUser: User ......Android Studio 的空值检查,在代码提示中 Intent 的 getParcelableExtra 方法返回的是非空,因此这里你直接用方法结果赋值不会有任何警告。...变量或形参声明为非空 这点与第一、第二点都很类似,主要是使用过程中一定要进一步思考传递过来的值是否真的非空。...有人可能会说,那我全部都声明为可空类型不就得了么 —— 这样做会让你在使用该变量的所有地方都需要判空,Kotlin 本身的便利性就荡然无存了。

    88610

    4. 变量声明和变量状态设计

    上一篇文章讲的是空安全特性,它允许你方便的处理对象可能为空的情况。但他价值更大的另一面在于,Kotlin 可以声明不可能为空的对象。 1. 非空类型 对象不可能为空意味着程序复杂度的降低。...在 Java 的环境里,我们出于对调用的 SDK 的不信任,总是要去判断以下是否为空,以保平安,这样处理的代价就是,增加了大量的异常分支代码。如果一个变量他永远都不可能为空,那其实是一件很快乐的事!...2. lateinit 说到尽量声明为非空类型,有人就会提出质疑了:非空类型说来简单,但部分依赖外部调用完成初始化的变量,无法声明为非空类型啊?...这看起来像是一个把 Kotlin 空安全废掉,退化为原来 Java 的无空检查的行为。...空对象就是拥有这个类默认实现的对象。对于数据类来说,它的空对象可能所有成员变量都是0,false,长度为0的字符串;对于带方法的类来说,它的空对象可能是所有方法都是空的,可以调用但没有任何效果。

    1.7K30

    是时候使用Kotlin编程了

    kotlin中的可变集合对Java的集合进行了包装,同时它实现了一套不可变集合库。...伴生对象的调用跟Java一样,通过类名.属性名称或函数名称调用。 新特性 1,空安全 在Kotlin中,对象声明分为可空引用和非空引用两种。...但是这里要注意一点,如果从Java返回的集合,不会强制做可空检查,这个是时候如果给不可空引用赋值Java集合中的null会出现转换错误异常。...3,字符串模板 字符串中可以包含变量或者表达式,以$符号开头(这跟JSP的EL表达式有点像),比如: 4,操作符重载 Kotlin为基本的运算符提供了固定名称函数表,此部分比较多,关于这方面的内容...4.9 Kotlin动态类型 4.10 Kotlin空安全 4.9.1 可空类型与不可空类型 4.9.2 判空操作符 4.9.3 Elvis 操作符 4.9.4 强校验操作符 4.9.5 安全的类型转换

    3.3K10

    你应该切换到Kotlin开发

    现在是开始使用新的编程语言的时候了。自从Kotlin成为谷歌官方语言后,你有没有心动? ? 我想告诉你一个名为Kotlin的新编程语言并且阐述为什么你应该考虑下一个项目中使用它。...但是我将会聚焦到最初的环境(JVM) 所以以下会给出几个你为什么需要切换到Kotlin语言开发的原因(没有先后顺序) 一、与Java的互通性 Kotlin能够达到和JAVA的100%互通,也就是说你可以使用...") 十六、空值安全 Java是一种应该称之为几乎静态类型的语言,在Java中,String类型的变量不能保证引用String(安全) - 它可能引用为null,即使我们已经习惯了这个类型,它抵消了静态类型检查的安全性...(NullPointerException)或者想法设法的避免(有点多于的工作) Kotlin则是通过区分非空类型和空类型来解决这个问题。默认情况下,类型为非空,并且可以默认添加一个?...1、如果lambda表达式的是方法的最后一个参数或唯一的参数,则可以移动或省略方法括号 2、如果我们选择不声明一个single-argument-lambda,它将被隐式声明为it 由以上两点可以得到以下三行代码形式

    48200

    Kotlin简单问

    kotlin为什么被设计出来 kotlin被设计出来并被Google推广,主要有以下优势: 完全兼容Java 更少的空指针异常 更少的代码量,更快的开发速度(lambda表达式,扩展函数) kotlin...kotlin的空安全 java中,我们可以任意初始化一个变量,而不需要赋值,比如String,就有它的默认值null。 String a; 如果要调用对象的参数,必须判空: if (a!...length val和var val,全称value,声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋值了,所以相当于java中的final变量。...kotlin中这么设计的原因主要是把不可变变量 这种因素和可变变量拿到同一级来设计,也就是说我们以后编码设计变量的时候,必须要考虑这个变量是不可变还是可变的,保护变量安全,养成良好习惯,而不像以前要在java...kotlin中,对于$符号表示 串模板,就是可计算的代码片段,可以将其计算结果链接到字符串中。

    88230
    领券