我开始在现有项目中使用findbugs @Nonnull
和@CheckForNull
注释,以防止NPE,并认为它非常好用。
我使用@Nonnull
作为返回类型和参数的默认值,并且已经找到了几个NPE,只需添加默认值即可。现在我找到了一个类似的方法:
@Nonnull
private Integer getInteger(String key) {
return Map.get(key);
}
它不会产生警告。我明白为什么会这样,但我怎么能解决这个问题呢?你如何在你的项目中解决这个问题?
可以全局应用的解决方案将是优选的,例如,类似于@ApplyCheckForNullToAllExternalCalls
。
答案 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
取消警告,但这可能会使您的代码过于混乱。