如何在外部库中使用findbugs @Nonnull?

时间:2013-01-07 10:45:39

标签: java findbugs

我开始在现有项目中使用findbugs @Nonnull@CheckForNull注释,以防止NPE,并认为它非常好用。 我使用@Nonnull作为返回类型和参数的默认值,并且已经找到了几个NPE,只需添加默认值即可。现在我找到了一个类似的方法:

@Nonnull
private Integer getInteger(String key) {
    return Map.get(key);
}

它不会产生警告。我明白为什么会这样,但我怎么能解决这个问题呢?你如何在你的项目中解决这个问题?

可以全局应用的解决方案将是优选的,例如,类似于@ApplyCheckForNullToAllExternalCalls

1 个答案:

答案 0 :(得分:1)

您可以通过将注释添加到包的@CheckForNull文件中,将package-info.java应用于包中的所有方法返回值(和/或参数),但您无法控制单个方法。

首先,在项目的实用程序包中创建@ReturnValuesAreCheckForNullByDefault

@Documented
@CheckForNull
@TypeQualifierDefault(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ReturnValuesAreCheckForNullByDefault { /* noop */ }

接下来,创建src/java/util/package-info.java

@ReturnValuesAreCheckForNullByDefault
package java.util;

import my.project.util.ReturnValuesAreCheckForNullByDefault;

最后,享受您的FindBugs警告。

@Nonnull
public String getValue() {
    Map<String, String> values = new HashMap<>();
    return values.get("foo");    // <-- Possible null pointer dereference ...
}

执行此操作的问题在于,java.*个包中有许多方法返回null。在不检查null的情况下使用这些将引发警告。例如,这个NPE安全代码也会发出警告:

@Nonnull
public Set<String> getNotNull() {
    Map<String, String> values = new HashMap<>();
    return values.keySet();
}

您可以使用@SuppressFBWarnings取消警告,但这可能会使您的代码过于混乱。