Kotlin學習之旅第五天
今天的主題是:高級語法
前言
高級語法
空安全
寫過Java代碼的人都知道,空指針異常是時刻都要注意的,特別是在Android裏面,一個NullPointerException就會讓App Crash,因此在Kotlin裏面,爲了消除來自代碼空引用的危險,默認引用是不能爲空的。關於空指針異常,這裏還有個趣聞:《十億美元的錯誤》
在Kotlin裏面,如果允許某個變量爲null,我們可以通過 “ ? ” 來表示:
var b: String? = "abc"
b = null // ok
var a: String = "abc"
a = null // 編譯錯誤
如果變量是可以爲空的,那麼每次都需要顯示檢查是否爲null:
val l = if(b != null) b.length - 1
或者,通過安全調用操作符 -> " ?. "
fun main(args: Array<String>) {
val a = "Kotlin"
val b: String? = null
println(b?.length) // 如果b爲null,則返回null
println(a?.length)
}
!!操作符
這個操作符在kotlin裏面經常都能看到,他的作用就是:非空斷言操作符。例如: a!! ,如果a爲null,那麼就會拋出異常,如果不爲null,則返回a的值
因此,如果你不希望NPE沒有被捕獲而導致appcrash,也不希望字符串爲null但是沒有處理,那麼你就需要使用!!操作符,在變量爲null的時候會拋出異常,我們就能在控制檯看到了。
異常
在Kotlin中,我們使用throw - Exception 來拋出異常:
throw Exception("this is an exception")
使用try來捕獲異常:
try {
} catch (e: Exception){
} finally {
}
這個語法結構和Java裏面是很類似的
反射
類引用
在反射中我們用的比較多的就是**類引用
**
val c = MyClass::class
該引用是 KClass 類型的值。
請注意,Kotlin 類引用與 Java 類引用不同。要獲得 Java 類引用, 請在 KClass
實例上使用 .java
屬性。
函數引用
通常我們會直接調用函數,通過 xxx() 來調用,但是我們也可以把函數傳給另外一個函數當參數,使用的也是 ::
操作符
fun isOdd(x: Int) = x % 2 != 0
fun main(args: Array<String>) {
val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
}
在這個例子裏面,我們首先定義了一個函數isOdd() 判斷參數x是否爲奇數,在main函數裏,我們把這個方法作爲參數傳到了filter()方法裏,這裏其實是把函數當成 函數類型的值
,這個和Lambda表達式有點類似,都是把函數作爲參數。
屬性引用
同樣,我們也是使用::
來引用屬性
val x = 1
fun main(args: Array<String>) {
println(::x.get())
println(::x.name)
}
在這裏,表達式 ::x
的意思是:
求值爲 KProperty<Int>
類型的屬性對象,它允許我們使用 get()
讀取它的值,或者使用 name
屬性來獲取屬性名。更多信息請參見關於 KProperty
類的文檔。
總結
除了上面說的這幾個語法,其實官方文檔還有別的,例如:註解,類型別名,類型安全的構造器等等,我覺得這些語法用的都比較少,在看到或者需要用到的時候再去了解也可以,所以這裏就沒講。
其實Kotlin的語法和Java還是很相像的,只是有一些技巧或者特性,需要在實踐中掌握,從而提高開發效率。因此明天開始我們就會進入:Kotlin Idioms 環節,介紹一些好用的開發技巧~
Day 5 - Learn Kotlin Trip, Completed.