findViewById()可能会产生NullPointerException

时间:2015-11-12 12:16:45

标签: java android-studio nullpointerexception inspection

我有很多这样的电话:

(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中的注释)

幸运的是,有作品,但我能做出的代码是否有改进?

3 个答案:

答案 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)和然后选择一个建议的解决方案。