- Kotlin入門筆記一:方法、變量、類
- Kotlin入門筆記二:when、for、in
- Kotlin入門筆記三:可空類型
- Kotlin入門筆記四:集合
- Kotlin入門筆記五:可見修飾符
- Kotlin入門筆記六:Lambda語法
- Kotlin入門筆記七:Lambda之引用
- Kotlin入門筆記八:Lambda和序列
這次文章給大家介紹下Kotlin中的可空類型,說起可空這個問題,那就不得不提空指針異常啦,大家在開發中肯定被空指針折磨的不要不要的。筆者在實習期間可是被空指針困擾了很長時間,動不動APP就Crash掉了,打開Log一看,java.lang.NullPointerException
就出現在眼前,接著就開始了漫長的非空判斷。
但是在kotlin中,這種現象得到了很好的控制,kotlin引入了可空類型,給開發者帶來了完美的解決方案,下面就來學習學習一下kotlin中可空類型。
1.可空類型的變量
kotlin中可以直接將一個變量聲明為可空類型,允許它為空,并且加入了很多的運算符,我們來一一學習:
首先我們來看看java中常規的判斷一個字符串是否為空的寫法:
public static void main(String[] args) {
checkStringNull("");
}
?
private static String checkStringNull(String string) {
return string == null ? "null" : string;
}
}
// 輸出:null</pre>
再來對比下kotlin對可空變量的處理
var string: String?
string = null;
println(checkStringNull(string))
}
?
fun checkStringNull(string: String?): String? {
return string
}
// 輸出:null</pre>
這里我們首先看到函數傳了一個String
類型的參數,并且String
后面多了一個?
,這就是kotlin的可空類型的聲明,它無需再像java那樣判斷是否為空,kotlin這種是允許為空,在聲明過后,這個變量就默認存儲了一個null
引用,如果這個變量為空的話,就會取出這個null
引用。如果沒有?
修飾的變量是默認不可為空的。
2.安全調用運算符:"?."
上面我們知道了如何聲明一個可空類型的變量,接著我們來看看如何運用這個可空變量:
我們通過一個例子來欣賞下安全調用運算符的強大之處:java版和kotlin版的小寫轉大寫
java:
public static void main(String[] args) {
String string = null;
stringToUpperCase(string);
}
?
private static String stringToUpperCase(String string) {
return string.toUpperCase();
}
}
輸出結果
// AAA
// Exception in thread "main" java.lang.NullPointerException
// at MyNull.stringToUpperCase(MyNull.java:10)
// at MyNull.main(MyNull.java:6)
很明顯,在stringToUpperCase
方法中沒有對string
進行非空判斷,導致NullPointerException
的異常拋出。
kotlin:
val string: String? = "aaa"
val nullString: String? = null
println(stringToUpperCase(string))
println(stringToUpperCase(nullString))
}
?
fun stringToUpperCase(string: String?): String? {
return string?.toUpperCase()
}
輸出結果:
// AAA
// null
kotlin卻沒有拋出異常,而是返回了null
,是不是很驚訝kotlin的強大,讓我們來看看kotlin的安全運算符是如何處理的:
只有當String
不為空時,才會調用toUpperCase
方法,String
為空的時候,直接返回了null
,這下媽媽再也不怕我們忘記處理空指針的情況了,哈哈~~
3.Elvis運算符:"?:"
在日常開發中我們也許會遇到這么一個需求:如果接口返回的數據為空,顯示為“--”。這就得對數據為空的情況額外處理了,我們還是對比java和kotlin的做法:
java
public static void main(String[] args) {
String string = "aaa";
String nullString = null;
System.out.println(checkStringNull(string));
System.out.println(checkStringNull(nullString));
}
?
private static String checkStringNull(String string) {
return string == null ? "--" : string;
}
}
?
輸出結果:
// aaa
// --
java中我們可以使用三元運算符來判斷是否為空,然后處理,這算是比較簡潔的寫法了,再來看看kotlin是否更簡單。
kotlin
val string: String? = "aaa"
val nullString: String? = null
println(checkStringNull(string))
println(checkStringNull(nullString))
}
?
fun checkStringNull(string: String?): String? {
return string ?: "--"
}
輸出結果:
// aaa
// --
對比之下,kotlin代碼貌似更簡單了呢,同時也出現了新的運算符,它就是:"?:" Elvis運算符,用來替代null
這種默認值的情況。
結合著這張圖,我們來看看"?:"是如何處理的,bar
是用來代替默認值null
的,如果foo==null
,那么就直接返回bar
,和java中string == null ? "--" : string;
三元運算符作用類似。
4.非空斷言:"!!"
kotlin還提供了一個運算符,如果你確定你的變量不可能為空,那么就可以使用!!來修飾你的變量,這種情況下,如果你的變量出現了null
的情況,就會拋出空指針異常,我們來通過代碼感受下:
fun main(args: Array<String>) {
val string: String? = "aaa"
val nullString: String? = null
println(sureNotNull(string))
println(sureNotNull(nullString))
}
fun sureNotNull(string: String?): String? {
return string!!
}
輸出結果:
// Exception in thread "main" aaa
// kotlin.KotlinNullPointerException
// at MyNullKt.sureNotNull(MyNull.kt:9)
// at MyNullKt.main(MyNull.kt:5)
非空斷言要謹慎使用哦,別斷著斷著你的程序就crash掉了...
這期就給大家帶來這么多,看完是不是覺得kotlin對開發者友好多了,有了可空類型的變量,我們就不必對接口返回的數據一一進行非空判斷了。下期筆者將為大家介紹下kotlin中的集合。
寫在最后
每個人不是天生就強大,你若不努力,如何證明自己,加油!
Thank You!
--Taonce
如果你覺得這篇文章對你有所幫助,那么就動動小手指,長按下方的二維碼,關注一波吧~~