有没有办法假设@Nullable是默认的? (使用FindBugs或任何其他免费工具)

时间:2010-05-07 21:48:58

标签: java static-analysis nullable

考虑这样的代码

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?

3 个答案:

答案 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文件中。