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更少。。。(Ctrl+F1)

该检查分析方法控制和数据流,以报告可能的情况始终为true或false的条件,其值为静态证明是恒定的,以及可能导致违反可归零性合同。

变量、方法参数和标记为@Nullable@NotNull的返回值被视为可为null(或分别不为null),并在分析期间用于检查可空性合约,例如报告可能的NullPointerException错误。

使用@Contract可以定义更复杂的合同注释,例如:

@Contract("_, null -> null")—如果方法的第二个参数为null,则方法返回null@Contract("_, null -> null; _, !null -> !null")—如果第二个参数为null,则方法返回null,否则返回

@Contract("true -> fail")——一个典型的assertFalse方法,如果传递true给它,则抛出异常

检查可以配置为使用自定义@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 不会有任何问题

应该忽略问题;

正如@DanDar3所写的那样->getView()可以返回null,AndroidStudio强调了这一点。

但如果你真的想让AndroidStudio快乐-当然你可以…:
Just-assert视图不为空:

View view = getView();
assert view != null;
(ListView) view.findViewById(R.id.main_list_view);
(TextView) view.findViewById(R.id.items_no);

这是因为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),然后选择建议的解决方案之一。

相关内容

  • 没有找到相关文章

最新更新