为什么要编译可为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的空值并不好。但这是你现在唯一的办法。