我有很多这样的电话:
(ListView) getView().findViewById(R.id.main_list_view);
(TextView) getView().findViewById(R.id.items_no);
....
并且AndroidStudio告诉我他们可能会采用NullPointerException
:
方法调用
getView().findViewById(R.id.main_list_view)
可以 减少java.lang.NullPointerException
...(Ctrl + F1)此检查分析方法控制和数据流以进行报告 始终为true或false的条件,值为的表达式 被证明是不变的,以及可能导致的情况 可违反合同的行为。
变量,方法参数和 标记为
@Nullable
或@NotNull
的返回值被视为可为空 (或不分别为null)并在分析期间用于检查 可空性合同,例如报告可能NullPointerException
错误。可以使用
@Contract
定义更复杂的合同 注释,例如:
@Contract("_, null -> null")
- 如果第二个参数为null,则方法返回null@Contract("_, null -> null; _, !null -> !null")
- 如果第二个参数为null,则方法返回null,否则返回
@Contract("true -> fail")
- 一种典型的assertFalse
方法,如果将true传递给它,则抛出异常可以将检查配置为使用自定义
@Nullable
@NotNull
注释(默认情况下将使用annotations.jar中的注释)
幸运的是,有作品,但我能做出的代码是否有改进?
答案 0 :(得分:4)
这是android.support.v7.app.AppCompatActivity中的已知问题,已在v24中修复。
https://code.google.com/p/android/issues/detail?id=203345
你对android.support.v4.app.FragmentActivity或android.app.Activity没有任何问题
答案 1 :(得分:2)
你应该忽略问题;
正如@DanDar3所写 - > getView()可以返回null,AndroidStudio突出显示。
但如果你真的想让AndroidStudio感到高兴 - 确定你可以......: 断言视图不是空的:
View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);
答案 2 :(得分:1)
这是因为getView()
可能返回null并注释为@Nullable
,请查看源代码及其JavaDoc - CTRL +单击代码中的getView()调用。
/**
* Get the root view for the fragment's layout (the one returned by {@link #onCreateView}),
* if provided.
*
* @return The fragment's root view, or null if it has no layout.
*/
@Nullable
public View getView() {
return mView;
}
您可以自己包装代码并检查null以使警告消失,或者将光标放在findViewById()调用内的任何位置,等待几秒钟以使灯泡显示(或按Alt + Enter)和然后选择一个建议的解决方案。