【问题标题】:Android Studio complains of expression being null even after check即使在检查之后,Android Studio 也会抱怨表达式为空
【发布时间】:2017-06-17 02:11:12
【问题描述】:

我的FragmentonCreateView() 方法中有以下代码行。它警告我createPinPresenter.setLoginResult() 的表达式可以是null

所以我要求 AS 生成 null 检查,它会这样做。

即使在自动生成代码之后,AS 仍然会抱怨相同的表达式是 null。显然支票里面不能是null

我在这里遗漏了一些明显的东西还是这是一个错误?

编辑:我使用的是 AS 版本 2.2.3

【问题讨论】:

  • 更可能不是错误,只是不够聪明,无法阅读上面的代码并查看空值检查。查看一个函数是否可以返回 null 很简单,很难解析代码并查看它是否实际检查过。
  • @GabeSechan 但是,一旦完成适当的检查,我已经看到 AS 发出警告(可能不是空值)。它不应该为此做同样的事情吗?例如,它要求将assert expression != null 转换为if(BuildConfig.DEBUG && expression) {throw new AssertionError();}
  • 即使这比您期望的要容易-您不是在寻找它来解析整个函数并分析上下文,而是在看一个简单的单行规则-如果调用 assert(blah),转换为 if(BuildConfig.DEBUG) 等等。您想要的更多的是功能请求而不是错误。

标签: android android-studio null warnings


【解决方案1】:

这是正确的,AS 怎么知道 getParcelable() 是否会返回相同的值?它只是一个句法控制,而不是一个语义控制。 例如,如果函数被调用的次数是奇数,则函数可能会返回 null:在这种情况下,警告是正确的。

这样想:

if (getNextValue() != null)
   value = getNextValue();

如果getNextValue() 增加一个索引,在数组末尾它可能会返回null:错误非常明显,实际上是控件试图在您的代码中阻止的。

唯一的解决方案是将getParcelable(KEY_LOGIN_RESULT) 的结果存储在一个临时变量中,这样AS 会正确管理它。

当然......事实上,这是一个自动生成的代码,我认为实际上是自动生成的一个错误,它不如控件聪明。

【讨论】:

  • 是的,我同意自动生成是一个错误。我已经在code.google.com/p/android/issues/detail?id=233192 上打开了一个问题,让我们看看开发人员有什么要说的。
  • 我什么都不相信。创建局部变量不是 AS,而是代码中可能出现错误的另一个来源。
  • AS 在我们执行“提取变量”重构时确实会创建变量。这些变量在范围内也是唯一的。
  • 但在这种情况下,您明确要求 AS 创建新变量。无论如何,我不知道:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 2012-01-14
  • 1970-01-01
相关资源
最近更新 更多