如何告诉IDEA / Studio已完成空检查?

时间:2013-10-10 17:19:16

标签: intellij-idea android-studio

我正在使用Android Studio / IntelliJ IDEA进行开发。

我启用了名为“恒定条件和例外”的检查检查,如果我冒着NPE的风险,则显示警告,例如:

String foo = foo.bar(); // Foo#bar() is @nullable
if (foo.contains("bar")) { // I'm living dangerously
    ...
}

我的代码中有以下内容:

String encoding = contentEncoding == null ? null : contentEncoding.getValue();
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
    inputStream = new GZIPInputStream(entity.getContent());
} else {
    inputStream = entity.getContent();
}

以下是TextUtils#isEmpty(String)的源代码:

/**
 * Returns true if the string is null or 0-length.
 * @param str the string to be examined
 * @return true if str is null or zero length
 */
public static boolean isEmpty(CharSequence str) {
    if (str == null || str.length() == 0)
        return true;
    else
        return false;
}

我没有冒任何NPE的风险,因为TextUtils#isEmpty(String)将返回true null指针。

但是我仍然收到小Method invocation 'encoding.equalsIgnoreCase("gzip")' may produce 'java.lang.NullPointerException'警告,这可能很烦人。

是否可以更智能地进行此检查,如果已经进行了空检查,则忽略NPE警告?

6 个答案:

答案 0 :(得分:18)

你可以查看Peter Gromov在answer中提到的链接。

创建了一些类似于您的设置的简单类:

带有@Nullable注释方法的类:

enter image description here

TextUtil类及其isEmpty方法:

enter image description here

最后调用TextUtil#isEmpty的主类:

enter image description here

现在,如果您输入File -> Settings...并转到Inspections ->Constant conditions & exceptions部分,则可以更改Configure Assert/Check Methods以适应您的isEmpty方法:

enter image description here

添加新的IsNull检查方法:

enter image description here

输入TextUtil类,isEmpty方法和CharSequence参数:

enter image description here

这会给出Assert/Check Method Configuration窗口:

enter image description here

再次按Ok,然后按Ok返回编辑器视图,您会看到检查消失:

enter image description here

您实际上是在告诉IntelliJ isEmpty方法正在对str参数进行空检查。

答案 1 :(得分:9)

您可以使用//noinspection ConstantConditions删除以下行的NPE警告,如下所示:

String encoding = contentEncoding == null ? null : contentEncoding.getValue();

//noinspection ConstantConditions
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
    inputStream = new GZIPInputStream(entity.getContent());
} else {
    inputStream = entity.getContent();
}

答案 2 :(得分:4)

您可以使用@SuppressWarnings("ConstantConditions")注释

@SuppressWarnings("ConstantConditions")
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int indexViewType) {
    if (inflater == null) {
        inflater = LayoutInflater.from(parent.getContext());
    }
    ItemViewProvider provider = getProviderByIndex(indexViewType);
    provider.adapter = MultiTypeAdapter.this;
    return provider.onCreateViewHolder(inflater, parent);
}

答案 3 :(得分:1)

有关IDEA 12,请参阅http://www.jetbrains.com/idea/webhelp/configuring-check-assert-methods.html。 在IDEA 13 EAP中,您可以添加方法合同:http://youtrack.jetbrains.com/issue/IDEA-93372

答案 4 :(得分:0)

不幸的是,标记为“正确答案”的解决方案已过时。但是我找到了对我合适的解决方案。

IDE的新版本可与静态方法正常配合使用。因此问题中的示例不再发出警告。

TextUtils#isEmpty(String);

public static boolean isEmpty(CharSequence str) {
    // your checks
}

答案 5 :(得分:0)

  1. 选择“ TextUtils.isEmpty”。
  2. 右键单击->显示上下文操作->添加方法合同。
  3. 输入“ null-> true”。
  4. 保存配置xml。

请检查详细信息here