Kotlin Android 第6天,从 0 到 ML - null safety ​

Kotlin Android 第6天,从 0 到 ML - null safety

前言:

   如果有写java 的朋友,一定有写过一堆来判断null的程序,来防止程序runtime的时候出会错,kotlin null safety 这个语法真的在判断null 上一大救星,也是回不去java的一大特点。

大纲:

不行设定为null, IDE会提示你不行为null

 var ironAfterDay:String = "This is Day6 Null Safety" 
 ironAfterDay = null   

要允许设为 null 要加上?

 var ironAfterDay:String? = null
 

判断或是操作变数就要
https://ithelp.ithome.com.tw/upload/images/20210911/20121643FIpYzzP02e.png

改用下列三种方式

if (ironAfterDay != null) {
   println("ironAfterDay size"+ironAfterDay.length)
}
println("ironAfterDay size"+ (ironAfterDay?.length))
println("ironAfterDay size"+ (ironAfterDay?.length ?: "day6"))
    

但真的硬要给null ,要加上!! ,但真的是null app 就会 crash

println("ironAfterDay size"+ (ironAfterDay!!.length)) // Carsh

https://ithelp.ithome.com.tw/upload/images/20210911/20121643uV37kHOK1i.png

Elvis 操作符号,像是if else ,如果 ironAfterDay为null ,就给一个预设值。

//ironAfterDay = null 
println("ironAfterDay = "+ironAfterDay)

//public inline fun Any?.toString() = this?.toString() ?: "null"

null 函式呼叫

//call function
println("ironAfterDayLength = "+ ironAfterDayLength(ironAfterDayNull(ironAfterDay)))

println("ironAfterDayLength = "
       + ironAfterDayNull(ironAfterDay)?.let { ironAfterDayLength(it) })
}

//Function allow return null
private fun ironAfterDayNull(ironAfterDay: String):String?{
    return null
}

允许传入函式的参数为 null,在函式内就要判断,或是直接 throw Exception,两种方式

//Function allow parameter null ,  need add argument process null
private fun ironAfterDayLength(ironAfterDay: String?):Int{
    //case 1 return 0
    if (ironAfterDay != null) {
        return ironAfterDay.length
    }else{
        return 0
    }

    //case 2 add throw Exception
    if (ironAfterDay == null) {
        throw Exception("ironAfterDay is Null")
    }
    return ironAfterDay.length
}

心得:

null safety 叫 空安全,还是用英文好了,翻中文真的很怪。
现在要android studio 故意要null的范例,还真的有点不好写,不用等到build,直接就检查不过给你红字呀。
  

参考:

https://kotlinlang.org/docs/null-safety.html

<<:  EP 3: Use Shell to layout TopStore App

>>:  Day 11 - Rancher 丛集管理指南 - Monitoring 介绍

Day14. Module & #extend #prepend #include - Ruby 继承 part1

Day14-15 一共会介绍 Ruby的2类、4种继承方式。 在Day2 我们提到 Ruby 为单一...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 16 - 如何选取下拉式选单的值

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 在 E2E 测试中,不仅有选取元素...

[Day 9] 使用 Config4k 以 Typesafe 及 Validatable 的方式读取 Ktor 设定档

Web 框架提供 API 让开发者读取设定档是基本的必备功能,以 Spring 框架为例,从最早只支...

小学生学程序设计 Day 29:「同学们,按照身高排好! 实作篇」

嘿~~ 各位好,我是菜市场阿龙! 这集要介绍的是「泡泡排序(Bubble Sort)演算法的实作」 ...

Extra09 - Storybook - 元件开发框架

随着 Component Driven 兴起,元件化变为不可逆的趋势,在元件化後的可替换性与重复利用...