代码之家  ›  专栏  ›  技术社区  ›  alex2k8

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

  •  4
  • alex2k8  · 技术社区  · 14 年前

    考虑这样的代码

    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 annotation,但没有成功。

    public void m1(@Nullable String text) {
        System.out.println(text.toLowerCase()); // FindBugs: text must be nonnull but is marked as nullable
    }
    

    问题是,如果我忘记注释它,错误将被遗漏!!!

    如何使FindBugs(或任何其他免费工具)在默认情况下假定@Nullable?

    3 回复  |  直到 14 年前
        1
  •  3
  •   ctford    12 年前

    根据 Javadoc :

    @DefaultAnnotationForParameters 指示应使用提供的注释类的默认值对类或包的所有成员进行注释。

    (顺便说一下,Javadocs @DefaultAnnotation , @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).

        2
  •  0
  •   MeBigFatGuy    14 年前

    您可以在FindBugs中编写自己的检测器,以查找未选中null的参数的任何用法。做起来相对简单。

        3
  •  0
  •   jontejj    11 年前

    你要找的是@parametersarenullablefaulty( http://code.google.com/p/jsr-305/source/browse/trunk/ri/src/main/java/javax/annotation/ParametersAreNullableByDefault.java )但我建议您在默认情况下使用@parametersarenonnulls。它也会检测到你的错误代码。最好将它们作为包上的注释放在package-info.java文件中。