java - 为什么 findbugs 会为一种方法提供冗余的 nullcheck 而不是另一种方法

标签 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() 的返回语句标记为具有“已知为非空值的冗余空值检查”,但对 myFunc2() 感到满意。

是否期望 findbugs 对这些有不同的看法? (链接到文档将不胜感激)我是否完全误解了@Nonnull 在方法上的使用?

[编辑]

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

最佳答案

你必须明白redundant Null-Check是什么意思。当 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>

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

Which @NotNull Java annotation should I use?

关于java - 为什么 findbugs 会为一种方法提供冗余的 nullcheck 而不是另一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41883893/

相关文章:

java - 在这种情况下,FindBugs 'JLM_JSR166_UTILCONCURRENT_MONITORENTER' 是否可以安全地忽略

java - 在java类中获取后退点击的句柄

java - 文本文件比较

java - 选择性复制maven资源

java - 增强 netbean、DataNucleus 中的类

code-analysis - 代码分析: check if a String parameter of a given function is available in a *.属性文件

java - NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE

java - 在 Eclipse 中右键单击项目或文件时,查找错误不显示

java - 子类和父类(super class)中的同名变量

java - PDFBox:当前页面已满后如何创建新页面并定位文本