当前位置: 首页 > 知识库问答 >
问题:

如何让IntelliJ IDEA理解我的空检查方法?

燕永昌
2023-03-14

我有一个方法,其中一个参数被标记为@Nonnull注释。调用该方法的代码必须检查该值是否为null。而不仅仅是直接的x!=nullcheck,它正在调用另一个类上的实用程序方法。(在实际代码中,实用程序方法还检查它是否为空字符串)。

我的问题是Intellij Idea在非null方法调用上显示了一个检查警告,说我的变量“可能为null”。我知道它不能为空,因为实用方法检查-我怎么能告诉检查员?

因为这有点抽象,这里有一个最小的例子来说明我的意思:

package org.ethelred.ideatest;

import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;

/**
 * tests annotations
 */
public class AnnotationChecker
{
    public static void main(String[] args)
    {
        String x = null;
        if(args.length > 0)
        {
            x = args[0];
        }

        if(!isNull(x))
        {
            useObject(x);
        }

        if(x != null)
        {
            useObject(x);
        }
    }

    public static boolean isNull(@CheckForNull Object o)
    {
        return o == null;
    }


    public static void useObject(@Nonnull Object o)
    {
        System.out.println(o);
    }
}

这使用了JSR305注释。

在本例中,在对useObjectIntellij的第一次调用中,在x参数上放置一条警告,表示“参数“x”可能为null”。在第二次呼叫中,没有任何警告。

共有3个答案

石俊雄
2023-03-14

我不相信有任何方法可以用编写的代码来解决警告。我希望发现IntelliJ支持@SuppressWarnings的值,您可以在useObject(x)语句中使用该值,但根据此来源,它不支持。您可能只需要咬紧牙关,将代码更改为以下内容:

if (x != null && !isBlank(x)) {
    useObject(x);
}

请注意,我将方法isNull重命名为isBlank,因为据我所知,检查null的实际方法也会检查其他条件。

魏岳
2023-03-14

使用IDEA 12,您可以配置NotNull检查方法:http://youtrack.jetbrains.com/issue/IDEA-35808#tab=Comments

薛阳荣
2023-03-14

在IDEA 13中增加了非常奇特的功能,称为方法契约。例如,您可以有一个方法,如果遇到null,该方法会引发验证异常:

@Contract("null -> fail")
public static void validateNull(@Nullable final Object object) {
    if (object == null) {
        throw new ValidationException();
    }
}

IDEA将分析注释,如果您在可能的NPE之前调用它,则不会显示警告:

validateNull(user);
user.setSomething("something"); // no warning

您在IDEA的设置中有完整的文档(只需搜索方法契约)。要实现这一点,您需要对jetbrain的annotations jar有额外的依赖:

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>13.0</version>
</dependency>
 类似资料:
  • 下面的代码引发NullPointerException。即使有

  • 我定义了一个结构… 有时我给它分配一个空会话(因为不可能为零) 然后我想检查一下,如果它是空的: 显然这是行不通的。我怎么写?

  • 我有如下所示的JSON 我将文件读成字符串并创建一个JSONObject,如下所示 然而,我认为我可以用try catch将语句括起来 请建议在这种情况下是否有任何合理的理由放一个长的if条件,而不是仅仅try-catch-log然后继续。 您还可以分享使用JSONException在此上下文中是否有任何“优点”吗?

  • 问题内容: 我需要检查某个值是否为null。如果它不为null,则将一些变量设置为true。这里没有其他声明。这样的条件检查太多了。 有什么方法可以在不检查所有方法返回值的情况下处理此空检查? 我认为直接检查变量并忽略NullpointerException。这是一个好习惯吗? 问题答案: 不,在Java中捕获NPE而不是对您的引用进行空检查通常不是一个好习惯。 如果您愿意,可以使用这种东西: 或

  • 问题内容: 我定义一个结构… 有时我给它分配一个空的会话(因为nil不可能) 然后,我想检查一下是否为空: 显然这是行不通的。我该怎么写? 问题答案: 您可以使用==与零值复合文字进行比较,因为所有字段都是可比较的: 游乐场的例子 由于存在歧义,因此在if条件下,在组合文字周围需要括号。 上面的用法适用于所有字段都是可比较的结构。如果该结构包含不可比较的字段(切片,映射或函数),则必须将这些字段一