【问题标题】:Why does Android Studio indicate that an object might be null when it cannot be?为什么 Android Studio 指示一个对象可能为 null 而它不能为 null?
【发布时间】:2019-07-22 08:25:12
【问题描述】:

这是我正在使用的代码:

ref.get().addOnCompleteListener(task -> {
    if (task.isSuccessful()) {
        DocumentSnapshot document = task.getResult();
        if (document.exists()) {
            Log.d(TAG, "DocumentSnapshot data: " + document.getData());
        }
    }
});

这就是 Android Studio 突出显示错误的方式:

据我所知answer

成功完成的任务永远不会通过null 换成DocumentSnapshot

如何在不检查无效性的情况下解决此问题?谢谢!

【问题讨论】:

  • A successfully completed task 永不返回,但任务未成功完成,那会变成什么?你能期待什么??
  • @TanveerMunir 我不确定我是否理解你所说的。因为我用if (task.isSuccessful())所以任务返回成功吧?
  • 如果 task.getResult() 可能由于没有结果而返回 null 但任务已完成,那么 document 可能为 null 那么您如何初始化?
  • @TanveerMunir if (task.isSuccessful()) 这意味着task.getResult() 永远无法返回null?它只能返回一个空的快照,但 不能 `null。我错了吗?
  • 检测受限。如果成功,它永远不会为空,但编译器不知道这一点。它会看到一个您不检查的可为空返回

标签: android firebase android-studio google-cloud-firestore lint


【解决方案1】:

为什么Android Studio会提示一个对象可能为null 不能吗?

因为 lint 无法知道。 document.exists() 通常可以返回 null,这就是您看到警告的原因。 Lint 执行基本检查,但不知道有关 Firebase API 的详细信息。您甚至可以使用 Java Core API 重现此行为。

如何在不检查无效性的情况下解决此问题?谢谢!

如果你 100% 确定它永远不会为空,你可以使用

@SuppressWarnings("ConstantConditions")

但我不建议这样做,因为您不知道 Firebase API 将来是否会发生变化。也许下一个版本的 Firebase 将允许返回 null。

【讨论】:

  • @JohansBormman 另一种解决方案是使用Objects.requireNotNull 进行所需的呼叫。 @SuppressWarnings 太大了。
猜你喜欢
  • 2021-04-14
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
相关资源
最近更新 更多