为什么将可为空的cursor.getString()分配给不可为null的String编译?

时间:2019-03-09 11:59:57

标签: string kotlin android-sqlite nullable

我有此代码:

data class Site(val apikey: String, val id: Int) {
    companion object {
        val INVALID = Site("", 0)
    }

    lateinit var name: String
    lateinit var city: String
    lateinit var country: String
}

然后,在我的代码后面,我为site.city分配了SQLite数据库中的值:

site.city = cursor.getString(3)

我认为这不会编译,因为cursor.getString返回可为空的String,并且Kotlin的字符串默认情况下不可为空。但是,这可以正常编译,但是在运行时会崩溃,并显示以下内容:

  

java.lang.IllegalStateException:cursor.getString(3)不能为空

因为cursor.getString(3)返回null(有效,数据不在数据库中)。我签入调试器,然后getString()调用正常运行。

1 个答案:

答案 0 :(得分:2)

如果Java方法未使用@Nullable@NonNull进行注释,则Kotlin会将其视为platform type,然后将其分配给可为空或不可为空的变量,由您自行决定。您可以使用正确的类型。

Cursor的{​​{1}}方法的特定情况下,它既没有注释,也没有注释-the documentationgetString的实现界面可以选择是抛出异常还是在错误情况下返回Cursor

  

实现定义了结果以及当列值为null或列类型不是字符串类型时此方法是否引发异常。