为什么findbugs为一个方法而不是另一个方法提供冗余的nullcheck

时间:2017-01-26 22:10:15

标签: java findbugs

我一直在使用方法的@Nonnull和@Nullable注释给其他程序员(和我自己!)一个方法可以返回的线索。我终于决定在一个类上实际运行Findbugs(IntelliJ - FindBugs-IDEA v1.0.1),我不明白我所看到的行为。文档也没有帮助。

假设我有以下示例代码:

import javax.annotation.Nonnull;

public class Main {

    public static void main(String[] args) {
    }

    @Nonnull
    public static String myFunc(){
        return new String("foo");
    }

    @Nonnull
    public static String myFunc2(){
        return "foo";
    }
}

Findbugs将myFunc()的return语句标记为“已知为非空值的冗余nullcheck”,但对myFunc2()感到满意。

预计findbugs会看到不同的这些吗? (赞赏文档链接)我是否完全误解@Nonnull在方法上的使用?

[编辑]

经过一些研究,我认为org.jetbrains @Contract注释(合同违规更改为错误)将更好地满足我的需求。感谢Guillaume F.的帮助!

1 个答案:

答案 0 :(得分:2)

您必须了解冗余Null-Check的含义。当Findbugs给你这个警告时,它意味着你做了两次Null-Check,第二次没有必要。哪个符合你的例子。

在第一个代码中,new String("foo")执行隐式空检查,因为new String(null)将抛出异常。因此,这个新的String对象被隐式地检查为非null。然后在离开方法时再进行@Nonnull检查。 Findbugs看到了这个并给你警告。

在你的第二个代码中,没有这样的控制,因为你返回一个原始字符串并只进行一次@Nonnull检查。一切都很好。

也许您会想要使用edu.umd.cs.findbugs.annotations.NonNull。这个只是提示你想要一个非空结果的Findbugs,而不需要真正的检查。

如果您使用的是Maven:

    <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>annotations</artifactId>
        <version>${findbugs-annotations.version}</version>
        <scope>provided</scope>
    </dependency>

https://blogs.oracle.com/java-platform-group/entry/java_8_s_new_type

Which @NotNull Java annotation should I use?