可空類型和非空類型
val notNullString: String = "Hello"http://非空類型
val nullableString: String? = null//可控類型
val notNullString: Person = Person()//非空類型
val nullableString: Person? = null//可控類型
不加問號的類型都是非空類型,非空類型不能賦 null 值. 返回值為非空類型的函數不也能返回 null
空安全
什么是空安全?
我們在java中經常碰到 java.lang.NullPointerException 比如下面這段代碼:
public static void main(String... args){
int length = getString().length()
System.out.println(length);
}
public static String getString(){
//這里演示直接return null,在時機項目中有可能返回null 也有可能返回其他字符串
return null;
}
我們在調用這個方法的時候就有潛在風險會拋出空指針異常.編譯器也會警告我們這個 getString 方法有可能返回 null ,需要做下判斷.所以我們需要修改代碼為:
public static void main(String... args){
String str = getString();
if(str!=null){
System.out.println("invaild string");
}else{
int length = getString().length()
System.out.println(length);
}
}
public static String getString(){
//這里演示直接return null,在時機項目中有可能返回null 也有可能返回其他字符串
return null;
}
這樣的代碼在我們的java程序中經常碰到,在 Kotlin 中有專門的機制處理這種空指針異常.我們在 Kotlin 中定義一個函數,如下代碼所示:
fun getString():String{
return null
}
這段代碼是不能編譯通過的,原因是這個函數的返回值非空類型的 String .那怎么讓這段代碼編譯通過呢?
fun getString():String?{
return null
}
所以我們在 Kotlin 中看到有返回值為 String 或是其他非空類型的函數是,我們可以放心大膽的調用再也不用擔心空指針異常了.
注意:如果調用了返回值為可空類型的函數會并且操作了這個返回值會怎么樣,答案是編譯不通過.
如下代碼:
fun main(args: Array<String>){
//這里 .length 是編譯不通過的 應為這里會有潛在風險發生空指針 仍然需要做判斷
var length = getString().length
var name:String? = getName()
if(name == null){
println("invaild string")
}else{
var len:Int = name.length
}
//如果我們確定這個 getStrng 函數不會返回空可以使用如下語句
var len:Int = getString()!!.length
}
fun getString():String?{
return "aString"
}