为什么要编译可为null的cursor.getString()赋值给不可为null的字符串?

为什么要编译可为null的cursor.getString()赋值给不可为null的字符串?,string,kotlin,android-sqlite,nullable,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 } 然后,在后面的代码中,我使用SQLite数据库中的值分配sit

我有以下代码:

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
}
然后,在后面的代码中,我使用SQLite数据库中的值分配
site.city

site.city = cursor.getString(3)
我假设这不会编译,因为
cursor.getString
返回一个可为空的
String
,而Kotlin的字符串在默认情况下不可为空。但是,这可以很好地编译,但在运行时崩溃,原因是:

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


因为
cursor.getString(3)
返回
null
(这是有效的,数据不在数据库中)。我检查了调试器,调用
getString()
效果很好。

如果Java方法没有使用
@Nullable
@NonNull
进行注释,Kotlin会将其视为一个变量,并允许您自行将其分配给可为null或不可为null的变量。这取决于你使用正确的类型

Cursor
getString
方法的特定情况下,它不以任何方式进行注释,也不应该这样-表示
Cursor
接口的实现可以选择在错误情况下是抛出异常还是返回
null

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


如果Java方法未使用
@Nullable
@NonNull
进行注释,Kotlin会将其视为一个变量,并允许您自行将其分配给可为null或不可为null的变量。这取决于你使用正确的类型

Cursor
getString
方法的特定情况下,它不以任何方式进行注释,也不应该这样-表示
Cursor
接口的实现可以选择在错误情况下是抛出异常还是返回
null

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


谢谢不过,当我将平台类型分配给不可为空的
字符串
时,如果有某种警告,那就太好了。特别是如果您(正如Kotlin所做的那样)声称尽量减少
null
对象的问题。最初,平台类型都被视为可为null,但这使得与任何Java API交互都非常困难。因此,我们决定采用当前的方法,如果使用Java代码进行互操作,这种方法就不那么安全,但您可以得到更好的代码作为回报。这是一种权衡。在当前的解决方案中,正在积极维护的现代Java API可以添加nullability注释,以便从Kotlin(实际上也可以从Java)安全地使用,然后,当调用未使用
@Nullable
@NonNull
注释的java代码时,将kotlin属性-
city
-Nullable设置为空,这样您将从编译器获得一些帮助。不过,这不是一种很好的方法,因为调整类型以帮助处理来自java的空值并不好。但这是到目前为止你唯一的方法。谢谢。不过,当我将平台类型分配给不可为空的
字符串
时,如果有某种警告,那就太好了。特别是如果您(正如Kotlin所做的那样)声称尽量减少
null
对象的问题。最初,平台类型都被视为可为null,但这使得与任何Java API交互都非常困难。因此,我们决定采用当前的方法,如果使用Java代码进行互操作,这种方法就不那么安全,但您可以得到更好的代码作为回报。这是一种权衡。在当前的解决方案中,正在积极维护的现代Java API可以添加nullability注释,以便从Kotlin(实际上也可以从Java)安全地使用,然后,当调用未使用
@Nullable
@NonNull
注释的java代码时,将kotlin属性-
city
-Nullable设置为空,这样您将从编译器获得一些帮助。不过,这不是一种很好的方法,因为调整类型以帮助处理来自java的空值并不好。但这是你现在唯一的办法。