通过将注释添加到软件包的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.*
软件包合同不返回null
许多方法。使用这些而不检查null
将引发警告。例如,这个NPE安全的代码还提出了一个警告:
@Nonnull
public Set<String> getNotNull() {
Map<String, String> values = new HashMap<>();
return values.keySet();
}
可以抑制警告与@SuppressFBWarnings
,但是这可能会弄乱代码太多自己的喜好。
Findbugs如何知道'@ ReturnValuesAreCheckForNullByDefault'?我的意思是,FB如何知道如何解释您的自定义注释? –
['TypeQualifierDefault'](http://jsr-305.googlecode.com/svn/trunk/javadoc/javax/annotation/meta/TypeQualifierDefault.html)是JSR-305的一部分,并导致其他注释被结转添加到附加注释的元素(方法,参数,字段等取决于其参数)。有关JSR-305的示例,请参阅['ParametersAreNonnullByDefault'](http://jsr-305.googlecode.com/svn/trunk/javadoc/javax/annotation/ParametersAreNonnullByDefault.html),几乎与上述内容相同。 –
谢谢,我知道package-info.java,但没有想到为我的控制之外的软件包编写一个。然而,我认为你是对的,不能使某些Util方法@Nonnull会很烦人。 –