android - Lint 改进后的可运行时崩溃

标签 android kotlin android-room

这是我在Room.kt中的代码

@Query("SELECT * FROM databaseaugmentedskudetails WHERE sku = :sku")
fun getById(sku: String): DatabaseAugmentedSkuDetails
val result = getById(sku)
var canPurchase = if (result == null) true else result.canPurchase. // lint warns result == null is always false but in reality it can be null returned by dao

上面的行被翻译成Java
boolean canPurchase = result == null ? true : result.getCanPurchase();

一切正常,直到lint将我的kotlin代码更改为
var canPurchase = result?.canPurchase ?: true // lint warns safe call is unnecessary for non-null type 

转换为Java代码如下
boolean canPurchase = result != null ? result.getCanPurchase() : null;

然后,我不时在运行时遇到以下崩溃
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.Boolean.booleanValue()' on a null object reference

我认为 Lint 应该足够聪明,不会破坏我的代码。

我的问题是

为什么将result?.canPurchase ?: true转换为result != null ? result.getCanPurchase() : null?不应该返回true而不是null吗?

最佳答案

函数声明必须使返回类型可为空,以便使Kotlin知道该函数最终可以返回可为空的类型。

@Query("SELECT * FROM databaseaugmentedskudetails WHERE sku = :sku")
fun getById(sku: String): DatabaseAugmentedSkuDetails? // <- ? here

关于android - Lint 改进后的可运行时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62169638/

相关文章:

android - 在一段时间内禁用 radio 组(Android)

安卓。在 fragment : NullPointerException 中使用 SimpleCursorAdapter、SQLite 和 ListView

android - 对 Cloud Firestore 的多次写入是否有任何限制?

java - 使用 Axon CQRS 更改事件类别

android - 构建房间期间出现 StackOverflowError

android - Dalvik 正在寻找扩展名为 '.0' 的 .so 文件 - 为什么?

android - 让 Linux 在运行 WinCE 的汽车音响设备上运行

android - Room + RxJava2 无限循环案例

android - 在 Android studio 3 中找不到 Dokka 插件

android - 如何在 Kotlin 中创建通用适配器?