Android Studio抱怨即使在检查之后表达式仍然为空
在我的Android Studio抱怨即使在检查之后表达式仍然为空,android,android-studio,null,warnings,Android,Android Studio,Null,Warnings,在我的片段的onCreateView()方法中有以下代码行。它警告我,createPinPresenter.setLoginResult()的表达式可以是null 所以我要求AS生成null检查,它就是这样做的 即使在自动生成代码之后,AS仍然抱怨相同的表达式为null。它显然不能在检查内为null 我是否遗漏了一些明显的东西,或者这是一个bug 编辑:我使用的是AS版本2.2.3这是正确的,例如,如何知道getParcelable()是否会返回相同的值?它只是一个语法控制,而不是语义控制。
片段的onCreateView()
方法中有以下代码行。它警告我,createPinPresenter.setLoginResult()
的表达式可以是null
所以我要求AS生成null
检查,它就是这样做的
即使在自动生成代码之后,AS仍然抱怨相同的表达式为null
。它显然不能在检查内为null
我是否遗漏了一些明显的东西,或者这是一个bug
编辑:我使用的是AS版本2.2.3这是正确的,例如,如何知道getParcelable()是否会返回相同的值?它只是一个语法控制,而不是语义控制。
例如,如果函数被调用的次数是奇数,则函数可能返回null,在这种情况下,警告是正确的
你可以这样想:
if (getNextValue() != null)
value = getNextValue();
如果getNextValue()
增加一个索引,那么在数组的末尾它可能返回null
:错误非常明显,实际上控件试图在代码中阻止它
唯一的解决方案是将getParcelable(KEY\u LOGIN\u result)
的结果存储在一个临时变量中,这样可以正确地管理它
当然。。。事实上,这是一个自动生成的代码,实际上是一个bug,我认为,这是一个自动生成的bug,没有控件那么聪明。更可能不是bug,只是一些不够聪明的东西,无法读取上面的代码并看到空值检查。看一个函数是否可以返回null是很简单的,很难分析代码,也很难看它是否真的被选中了。@Gabeschen但我已经看到,一旦适当的检查完成,就会发出警告(可能不是null)。这不也应该这样吗?例如,它要求转换断言表达式!=null
toif(BuildConfig.DEBUG&&expression){throw new AssertionError();}
即使这比您期望它做的要简单-您不是在寻找它来解析整个函数和分析上下文,而是在寻找一条简单的单行规则-如果调用assert(blah),转换为if(BuildConfig.DEBUG)blah。你想要的更多的是一个功能要求,而不是一个bug。是的,我同意自动生成是一个bug。我在“让我们看看开发人员要说什么”上提出了一个问题。我什么都不相信。创建局部变量并非易事,而是代码中可能出现错误的另一个原因。在执行“提取变量”重构时创建变量也是如此。这些变量的作用域也是唯一的,但在这种情况下,您需要明确地请求创建新的变量。无论如何,我不知道:)