如何告诉Android Studio此语句中没有NullPointerException风险?

时间:2016-02-14 11:13:23

标签: java android android-studio

我有这段代码:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if (position < getItemCount()) {
        holder.bind(mServiceInfo.agencies.get(position));
    }
}

@Override
public int getItemCount() {
    return mServiceInfo != null && mServiceInfo.agencies != null ? mServiceInfo.agencies.size() : 0;
}

Android Studio通过onBindViewHolder方法向我发出警告,说我的mServiceInfo.agencies.get电话可能会引发NPE。

这种情况无法实现,因为position始终是一个正整数。我甚至将测试条件更改为:position >= 0 && position < getItemCount()但警告仍然显示。

这是它的样子:

Screenshot of warning in IDE window

如何配置IDE不在此处发出警告?

请注意:

  • 我不想禁用lint检查或为此语句禁用它。我知道可以禁用lint检查,这不是我的问题。此外,我喜欢避免禁用检查,因为在维护中代码可以更改,并且可能会保留IDE不关心一个检查的注释,这会导致意外/意外行为。
  • 除了并发性,没有条件会导致onBindViewHolder中的NPE,因此IDE警告在此处无效
  • 我确实关心警告,特别是当它关于检查NPE时,因为它们可以很容易地显示我做错的地方并避免可能的错误。警告非常重要,编译时我往往没有警告,特别是在他们发现可能的错误时。
  • 可以更改IDE与NPE的行为方式,this kind of answer正是我在发布此问题时的想法

1 个答案:

答案 0 :(得分:2)

出现警告是因为代码的静态分析表明其中一个字段可能是null。这可能是因为未在构造函数中设置的访问字段,@Nullable注释或其他一些静态分析事件。

首先,确保您正在处理NPE并且它不会发生。警告是有原因的。如果您选中了,则有4个选项:

  • 实际进行null检查
  • 重构您的代码,删除@Nullable,始终初始化字段
  • 完全禁用lint检查,或
  • 仅针对某些部分禁用检查

我推荐最后一个选项,因为它也适用于版本控制系统和其他工作站。 (如果你确定你知道自己在做什么。)

  1. Alt + Enter
  2. 选择Inspection 'Constant Conditions & Exceptions' options
  3. 选择你的选择。
  4. 您将看到注释将达到多远的预览,通常该语句的单个注释就足够了:

    enter image description here

    这将在上面添加以下注释,您也可以手动添加:

    //noinspection ConstantConditions
    getSupportActionBar().setTitle("My title");