2

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

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

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

可以全局应用的解决方案将是首选,例如@ApplyCheckForNullToAllExternalCalls.

4

1 回答 1

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,但这可能会使代码过于混乱,不合您的喜好。

于 2013-01-08T00:20:40.993 回答