1. var notNull: String = "hello"
  2. var nullable: String? = null

默认不可空,可空需要加上问号

访问可空属性

    var nullable: String? = null
    println(nullable?.length)

需要加上 ? 才能访问,否则编译报错。这里打印输出 null

强转为不可空类型

println(nullable!!.length)//如果nullable为空,则运行抛异常

强转类型为空时运行抛异常 :::danger 不推荐此方式! :::

Elivs ?:

    var nullable: String? = null
    println(nullable?.length)
   // println(nullable!!.length)
    println(nullable?.length ?: 0) //Elivs

nullable?.length ?: 0 ,当nullable 为空时,输出0。

空类型继承关系

    var x: String = "hello"
    var y: String? = "world"

    x = y // 编译报错
    y = x // ok

里氏替换原则:父类可以接收子类,但子类不能接受父类。
证明:String? 父类 , String 子类

平台类型不知道可空非空

空安全 - 图1

  • kotlin 可以编译成其他平台执行代码

假设有一个Java类,Personal.java。需要在kotlin中调用

public class Personal {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}
    val personal = Personal()
    val title1 = personal.title //类型String! 是平台类型(Java)
    println(title1.length)//空异常
  • kotlin 无法判断平台类型是否可空类型
  • val title1 类型是String! 无法在kotlin直接声明的,可以用ctrl+shift+P 查看类型

那有没有办法解决?不能彻底解决,可以在Java 类使用注解约束。

public class Personal {

    private String title;

    @NotNull
    public String getTitle() {
        return title == null ? "" : title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

又比如 Java 中一些方法,IDE无法判断可空

    val file = File("abc")
    val listFiles = file.listFiles() //这是Java方法 java.io.File
    println(listFiles.size) //运行抛空指针,ide只有警告

:::danger 在 kotlin 使用 Java API 还是要注意空指针问题! :::