可空类型和非空类型
val notNullString: String = "Hello"//非空类型
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"
}