gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:37:08 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

首先,在项目的实用程序包中创建@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.* 包中有许多方法根据契约(Contract)返回null。使用这些而不检查 null 将引发警告。例如,这段 NPE 安全代码也会引发警告:

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

您可以使用 @SuppressFBWarnings 来抑制警告,但这可能会使代码过于困惑以致于您不喜欢。

关于java - 如何将 findbugs @Nonnull 与外部库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14194304/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com