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

Kat*_*yA. 9 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

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

是否期望findbugs看到这些不同?(赞赏文档链接)我是否完全误解了@Nonnull对方法的使用?

[编辑]

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

Gui*_* F. 3

您必须了解冗余空检查的含义。当 Findbugs 向您发出此警告时,这意味着您进行了两次 Null-Check,并且第二次是不必要的。这符合你的例子。

在第一个代码中,new String("foo")执行隐式空检查,因为new String(null)会抛出异常。所以这个新的 String 对象被隐式地检查为非空。@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>
Run Code Online (Sandbox Code Playgroud)

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

我应该使用哪个 @NotNull Java 注释?