可空类型

* 类型就是数据的分类。决定了该类型可能的值,以及在该类型值上可以完成的操作。

* 与Java不同,Kotlin对可空类型的显示的支持。可空类型是Kotlin类型系统中帮助避免NullPointException错误的特性。* 这是一种指出你的程序中那些变量和属性允许为null的方式。

* 可空类型和非可空类型的对象在运行时没有什么区别,可空类型并不是非空类型的包装。所有检查都是在编译时期,所以Kotlin的可空类型并不会在运行时带来额外的开销。先来看看Java中的空指针是怎么造成的
private int stringLen(String s){retrun s.length
}

当传入的参数s为null的时候就会发生空指针异常、。

* 使用Kotlin声明同样的方法不接收可能为null的参数,因为当如果传入可能会null的参数在编译器就会被标记成错误。* 这样就保证了strLen函数永远不会在运行的时候抛出NullPointException
fun strLen(s: String) = s.length //Kotlin默认s是不可为null的参数如果你传入一个可能为null参数,编译的时候就会报错

  如果你想要声明一个接收参数可能为null的参数,就需要将这个参数声明为可空类型的参数,而可控类型的参数声明起来也特别简单,只需要咋参数的类型之后加上?

* ?可以加载任意类型的后面来表示这个类型的变量可以存储null引用。如String? Int? MyCustomType?* Type ? = Type or null* 没有问号的类型表示这种类型的变量不能存储为null.这说明说有的常见类型都是默认为非空的,除非显示地把它标记为可空的* 可空类型的变量不能直接调用其方法、不能把它赋值给费空类型的变量、也不能把可空类型的值传递给拥有非空类型的参数的函数。* 再与null 进行比较之后,编译器就会记住,并且在这次比较发生的作用域内把这个值当错非空来对待
fun nullAbleStrLen(s: String?): Int = if (null != s) s.length else 0

 安全调用符 

* Kotlin提供了一种非常有用的工具:安全调用运算符"?"* 它允许你把一次对null的检查和一次方法调用合并成一个操作。例如:s?.toUpperCase() 等同于 if(s!=null) s.toUpperCase() else null* 如果你试图调用一个非空值的方法,这次方法调用就会被正常执行。但是如果是null 这次调用就不会发生,而整个表达式的值就为null
fun printAllCaps(s: String?) {//这里要注意 因为后面的表达式返回值可能为空,前面的对象类型声明的时候就要声明成可空类型val allCaps: String? = s?.toUpperCase()println(allCaps)
}

* 安全调用不光可以调用方法,也能用来访问属性* Kotlin 支持多个安全调用链接再一起使用
fun managerName(employee: Employee): String? = employee?.name

class Address(val streetAddress: String, val zipCode: Int, val city: String, val country: String)
class Company(val name: String, val address: Address?)
class Person(val name: String, val company: Company?)fun Person.countryName(): String {val country = this.company?.address?.countryreturn if (null != country) country else "Unknown"
}

 Elvis 运算符“?:”

* Elvis 运算符“?:”* Kotlin 有方便的运算符来提供null的默认值。它被称作Elvis运算符(或 null合并运算符) ->  ?:** Elvis运算符接收两个运算数,如果第一个运算数不为null,运算结果就是第一个运算数,如果第一个运算数为null,运算结果就是第二个运算数
fun foo(s: String?): String {val t: String = s ?: " "return t
}

* Elvis运算符经常和安全调用运算符一起使用,用一个值代替对null对象调用方法时返回的null
fun strLenSafe(s: String?): Int = s?.length ?: 0

* 上面获取countryName的方法就可以使用Elvis进一步简化
fun Person.getCountryName(): String = this.company?.address?.country ?: "Unknown"

* Kotlin中 Elvis和return 、 throw 表达式结合再一起使用会更加好使
fun printShippingLabel(person: Person) {val address = person?.company?.address ?: throw IllegalArgumentException("No address")with(address) {println(streetAddress)println("$zipCode $city $country")}
}

 安全转换 "as?"

* 常规的as运算符和Java中的类型转换一样转换对象的类型,如果被转换的值不是你试图转化的类型,就会抛出ClassCastException。Kotlin提供了一种安全的类型转化操作 as?* as?运算符尝试把值转换成指定的类型,如果值不是合适的类型就返回null ,经常会和Elvis “?:” 一起使用。
class Person1(val firstName: String, val lastName: String) {override fun equals(other: Any?): Boolean {//类型检查如果不匹配就返回falseval otherPersion1 = other as?Person1 ?: return false//安全检查之后变量会被只能转换为Person1类型return otherPersion1.firstName == firstName && otherPersion1.lastName == lastName}override fun hashCode(): Int {return firstName.hashCode() * 37 + lastName.hashCode()}
}

 非空断言 “!!”

* 非空断言是Kotlin提供的一种简单直率的处理可空类型值的工具。* 它使用双叹号表示,可以把任何值转化为非空类型,如果要转换的值是null,则会抛出NullPointException异常
fun ignoreNulls(s: String?) {val sNotNull: String = s!!println(sNotNull)
}

//注意当使用!!并且它的结果是异常时,异常调用栈的跟踪信息只会表明异常发生在哪一行,不会表明异常时由那个值引起的,所以尽量避免在一行使用多个非空断言// person!!.company!!.address!!.name  出现异常的时候不好查找引起的对象
 

转载于:https://www.cnblogs.com/mauiie/p/kotlin_null.html

Kotlin学习与实践 (十)Kotlin的可空性相关推荐

  1. Kotlin 学习笔记(十四)浅读协程

    上一篇-Kotlin 学习笔记(十三)高阶函数 为什么需要协程   举例一个异步编程中最常见的场景:后台线程执行一个A任务,下一个B任务依赖于A任务的执行结果,所以必须等待上一个任务执行完成后才能开始 ...

  2. Kotlin学习与实践 (一)WWH (what?why?how)

    什么是Kotlin? 要回答这个问题吗,只需要点击Kotlin官网就能了解到: Kotlin是JVM和Android的实用编程语言,结合了OO和功能特性,专注于互操作性,安全性,清晰度和工具支持. 作 ...

  3. Kotlin学习与实践 (三)fun 函数

    通过例子来学习如何高效的在Kotlin中定义使用函数. 1.命名参数.默认参数.顶层函数.扩展函数 * 展示几种创建集合类的方法和扩展的简单操作集合类的方法 fun createCollection( ...

  4. Kotlin学习(二十): Kotlin实现流的读取的方案

    在Java对流的读取是下面的那样,当前不要忘记流的关闭close. // java 代码 void someFunc(InputStream in, OutputStream out) throws ...

  5. Kotlin学习笔记——安装配置kotlin

    这个系列主要为了整理一下自己学习kotlin的笔记以及学习过程中遇到的问题. 整个系列初期大约有20篇左右,我会尽快整理出来.后续会不定时更新,主要是实际使用的案例或者一些知识点的深入探讨. 1.安装 ...

  6. Kotlin学习(二)Kotlin基础语法

    学习一门语言,我总是会先学习一下基本的语法.因为并不急着应用Kotlin去开发项目,所以,还是有很多的时间去学习.今天,简单的总结一下Kotlin的基本语法. 一.函数 1.有参有返回值函数 fun ...

  7. Kotlin学习之路(1)——Kotlin的概念

    前言 记得学习Kotlin已经是2021年5月的事了,只是在写第二个个人项目时使用过,平时还是对Java语言的使用比较多,对Kotlin很多东西都有以往,并且也想起当时并没有写博客记录,只是在IDEA ...

  8. Kotlin学习 PART 2:kotlin基础

    想了很久,一直在想怎么记录笔记最高效,最后感觉还是结合代码比较好. 1.整数的遍历,in表示是否在一个区间内,!in表示不再某个区间内 fun fizzBuzz(i:Int) = when { i%1 ...

  9. Kotlin学习 PART 1:kotlin定义和目的

    从事android开发转眼间已经两年多了呢,一直用的java开发,早就想试试用kotlin进行开发,稍微瞄一眼 = =,感觉真的,某人说的还真的有点道理,kotlin比起你们用的那些垃圾语言要高级的多 ...

最新文章

  1. java中单例实现常用的方式_Java单例的常见形式
  2. ASP.NETmvc常用JQUERY插件【jquery.dataTables.js】
  3. HTML+CSS+JavaScript复习笔记持更(三)——表单篇
  4. hibernate-jpa/hibernate-jpa-2.1-api-1.0.0.final.jar源代码下载地址
  5. 你最想要的圣诞礼物是什么?
  6. MPLS ×××实验之OSPF sham-link
  7. php对表格的处理,JavaScript_js处理表格对table进行修饰,js处理表格 1、行颜色间隔显示 - phpStudy...
  8. 移动开发(C#、VB.NET)Smobiler开发平台——GifView控件的使用方式
  9. 让WKWebView支持NSURLProtocol
  10. vb中调用aspx页面
  11. Unity3D 学习教程 14 C# 旋转镜头
  12. sdi 采集卡---环视频拼接直播方案
  13. 如何在计算机自动开机时选择用户,电脑如何设置自动开机,详细教您如何设置...
  14. MATLAB疲劳检测系统
  15. 桂林理工大学 大学语文题库2021年春季学期
  16. 【金融系列】使用Python分析债券,画零息利率曲线,对债券进行精确定价,计算债券的麦考利久期、修正久期和凸度,并进行价格敏感性分析
  17. P2168 [NOI2015]荷马史诗
  18. (SEED-Lab)Buffer Overflow Vulnerability Lab缓冲区溢出实验
  19. 阿里云oss图片的常用处理方法小结
  20. mysql中select是什么意思_MYSQL中select的是详解

热门文章

  1. seaborn系列 (13) | 点图pointplot()
  2. 计算机运行游戏慢怎么办,电脑运行太慢了太卡了怎么办,台式电脑运行速度慢的解决方法...
  3. 数据结构 排序 java_Java数据结构之排序---希尔排序
  4. 图形学大牛归国投身产业,还是个让女孩们败家的赛道
  5. 在Hinton看来是“宇宙答案”GPT-3,到LeCun这里却“对世界一无所知”
  6. 高通加大5G应用力度:发布又一款手机芯片,还推出机器人和无人机5G系统
  7. 传奇芯片设计大神Jim Keller又离职了,英特尔失了总设计师,网友喊话雷军:挖他!...
  8. 中国首份AI落地白皮书发布!地方政府规模大,金融领域最积极,北京供给超上海深圳总和...
  9. ccf题库中2015年12月2号消除类游戏
  10. Tiny4412开发板 LED灯的控制