findViewById()可能会产生NullPointerException
我有很多这样的电话:
(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
less …(Ctrl + F1)此检查分析方法控制和数据流,以报告始终为真或假的可能条件,静态certificate其值为常量的表达式,以及可能导致违约性合同违规的情况。
标记为
@Nullable
或@NotNull
变量,方法参数和返回值被视为可空(或分别为非空),并在分析期间用于检查可空性合同,例如报告可能的NullPointerException
错误。可以使用
@Contract
注释定义更复杂的合同,例如:
@Contract("_, null -> null")
– 如果第二个参数为null,则方法返回null@Contract("_, null -> null; _, !null -> !null")
– 如果第二个参数为第二个,则返回null参数为null,否则为null
@Contract("true -> fail")
– 一个典型的assertFalse
方法,如果将true传递给它,则抛出exception可以将检查配置为使用自定义
@Nullable
@NotNull
注释(默认情况下将使用annotations.jar中的注释)
幸运的是,有作品,但是我可以对这段代码进行改进吗?
这是android.support.v7.app.AppCompatActivity中的一个已知问题,它已在v24中修复。
https://code.google.com/p/android/issues/detail?id=203345
android.support.v4.app.FragmentActivity或android.app.Activity不会有任何问题
这是因为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)然后选择一个建议的解决方案。
你应该忽略这个问题;
正如@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);