Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么findbugs为一种方法而不是另一种方法提供冗余的nullcheck_Java_Findbugs - Fatal编程技术网

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

Java 为什么findbugs为一种方法而不是另一种方法提供冗余的nullcheck,java,findbugs,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和@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()的返回语句标记为具有“已知为非null的值的冗余nullcheck”,但对myFunc2()感到满意

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

[编辑]


经过一些研究,我决定org.jetbrains注释(将违反合同更改为错误)将更好地满足我的需要。谢谢纪尧姆F.对你的帮助

您必须理解冗余空检查的含义。当Findbugs给出此警告时,意味着您执行了两次空检查,第二次检查是不必要的。这与你的例子相符

在第一个代码中,
newstring(“foo”)
执行隐式null检查,因为
newstring(null)
将引发异常。因此,这个新字符串对象被隐式地检查为非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>

com.google.code.findbugs


两者都不能为空,但基本上不需要使用新字符串(“字符串文字”)
。这只是一个比我实际的代码简单得多的例子,但听起来你好像忽略了相关的细节:它们是
String
s,允许你使用字符串文字;或者是别的什么?我已经添加了用于演示问题的完整类。findbugs抱怨的不是函数的使用——错误出现在myFunc的“return”行。记住,这只是一个例子。只是另一个Findbugs bug。谢谢——你的解释很有道理。不幸的是,使用edu.umd.cs.findbugs.annotations.NonNull不会改变结果——它不仅仍然抱怨冗余检查,还显示为已弃用,并建议使用javax.annotation.NonNull。我认为我最好的选择是搜索Findbugs的替代品,因为这种行为不是我想要的。如果Findbugs选项中的此特定警告困扰您,您可以禁用它,或者您可以使用
@SuppressWarnings
:我看到了您的编辑,很高兴您找到了解决方案。如果我的回答有帮助,你能这样做吗?非常感谢。