如何将 findbugs @Nonnull 与外部库一起使用?

2024-01-03

我开始使用 findbugs@Nonnull and @CheckForNull在现有项目上添加注释,以防止 NPE,并且认为它效果很好。 我用@Nonnull作为返回类型和参数的默认值,只需添加默认值,就已经发现了一些 NPE。现在我找到了类似的方法:

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

并且它不会产生警告。我明白为什么会出现这种情况,但是我该如何解决这个问题呢?您如何在项目中解决这个问题?

可以在全球范围内应用的解决方案将是首选,例如就像是@ApplyCheckForNullToAllExternalCalls.


您可以申请@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.*合同规定的包裹do not return null。使用这些而不检查null会发出警告。例如,这个 NPE 安全代码也会引发警告:

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

您可以使用以下命令抑制警告@SuppressFBWarnings,但这可能会使代码变得过于混乱,不符合您的喜好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 findbugs @Nonnull 与外部库一起使用? 的相关文章

随机推荐