9

我有很多这样的电话:

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

此检查分析方法控制和数据流,以报告始终为真或假的可能条件、其值被静态证明为常数的表达式以及可能导致可空性合同违规的情况。

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

更复杂的合约可以使用@Contract 注解来定义,例如:

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

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

可以将检查配置为使用自定义@Nullable @NotNull注释(默认情况下将使用 annotations.jar 中的注释)

幸运的是一切都有效,但是我可以对这段代码进行改进吗?

4

3 回答 3

5

这是 android.support.v7.app.AppCompatActivity 中的一个已知问题,它已在 v24 中得到修复。

https://code.google.com/p/android/issues/detail?id=203345

android.support.v4.app.FragmentActivity 或 android.app.Activity 不会有任何问题

于 2016-09-07T19:46:38.060 回答
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);
于 2017-09-23T23:37:06.617 回答
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),然后选择一个建议的解决方案。

于 2016-02-03T16:14:13.630 回答