【发布时间】:2016-02-13 18:20:09
【问题描述】:
我有很多这样的电话:
(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,则该方法返回 null@Contract("_, null -> null; _, !null -> !null")— 如果第二个参数为 null,则方法返回 null,否则返回非 null
@Contract("true -> fail")— 一个典型的assertFalse方法,如果将 true 传递给它,则会引发异常检查可以配置为使用自定义
@Nullable@NotNull注解(默认使用 annotations.jar 中的注解)
幸运的是一切正常,但我可以对这段代码进行改进吗?
【问题讨论】:
-
您想编写无法通过 NPE 的代码?
-
您使用的是 ViewHolder 模式吗?
-
@takendarkk 不,但我想了解为什么 ide 告诉我它可能会发生
-
因为如果你给方法一个不存在的 id 会发生什么?它返回空值。一点问题都没有。
-
我明白了,但是我可以对这段代码进行改进吗?
标签: java android-studio nullpointerexception inspection