【发布时间】:2019-04-10 17:36:27
【问题描述】:
我有 Dao 返回简单对象。如果对象不存在,Room 返回null,但Android 应用没有崩溃。此外,如果我将该值分配给非空变量,则应用程序中不会发生崩溃。
道:
@Query("SELECT * FROM users WHERE id LIKE :id LIMIT 1")
abstract fun getById(id: Long): User
不崩溃代码:
doAsync {
val user: User = userDao.getById(999) // user 999 not exist, userDao returns null
uiThread {
if (user == null) {
Timber.d("user is $user") // "user is null" in log
} else {
Timber.d("user is ${user.email}")
}
}
}
我有两个问题:
- Room 怎么可能将 Null 值作为非 Null 变量返回?
- 将 null 分配给 Non-Null 变量的代码怎么可能没有崩溃?
【问题讨论】:
-
你能重复你的第一个问题吗?你其实是在自相矛盾。你问:
How is possible that Room can return Null value as Non-Null variable?,但你的评论说user 999 not exist, userDao returns null -
@ZUNJAE 我的观点是函数
getById()具有非空返回值(User),但它返回空值。在那种情况下,我预计NullPointerException。 -
这是因为 Room 的底层代码返回一个可为空的值,但在 Kotlin 中,您强制它不可为空,这会导致 TypeCastException。我个人不知道解决方案,因为我现在有同样的问题。我只是将所有方法都注释为可为空的。
标签: android kotlin crash android-room kotlin-null-safety