考虑这样的代码
public void m1(String text) {
if(text == null)
text = "<empty>";
System.out.println(text.toLowerCase());
}
这是一个错误的版本:
public void m1(String text) {
System.out.println(text.toLowerCase());
}
如果传递null值,则可能抛出NullPointerException。我希望静态分析工具(例如FindBugs)报告此问题。不成功的FindBugs(至少在默认情况下)要求我明确指定@Nullable注释。
public void m1(@Nullable String text) {
System.out.println(text.toLowerCase()); // FindBugs: text must be nonnull but is marked as nullable
}
问题是,如果我忘记注释它,那就会错过错误!!!
如何默认使用FindBugs(或任何其他免费工具)来假设@Nullable?
答案 0 :(得分:3)
根据Javadoc:
@DefaultAnnotationForParameters
表示应该使用提供的注释类的默认值对类或包的所有成员进行注释。
(@DefaultAnnotation
的BTW Javadoc,@DefaultAnnotationForFields
和@DefaultAnnotationForMethods
包含完全相同的文字。)
但根据chapter 10 of FindBugs Manual:
这与DefaultAnnotation相同,只是它仅适用于方法参数。
虽然在理论上也是
@DefaultAnnotationForParameters(value = Nullable.class)
或
@DefaultAnnotationForParameters({Nullable.class})
应该有效,都不。
我不知道FindBugs是否支持这个但是和JSR 305你也可以使用@ParametersAreNullableByDefault
注释应用于包,类或方法。 Unfortunately FindBugs 1.3.9 ignores @ParametersAreNonnullByDefault and similar annotations (used on packages or on types).
答案 1 :(得分:0)
您可以在FindBugs中编写自己的检测器,查找未经过空检查的参数的任何使用。做起来会比较简单。
答案 2 :(得分:0)
您正在寻找的是@ParametersAreNullableByDefault(http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/ParametersAreNullableByDefault.java),但我建议您改用@ParametersAreNonnullByDefault。它也会检测到您的错误代码。最好将它们作为包装上的注释放在package-info.java文件中。