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);