Java Findbugs报告了一个不兼容的位掩码错误,但我没有';我不知道怎么做

Java Findbugs报告了一个不兼容的位掩码错误,但我没有';我不知道怎么做,java,sonarqube,static-analysis,findbugs,Java,Sonarqube,Static Analysis,Findbugs,我有一个比较器,在比较两个对象的内容之前检查它们的“null”。 比较方法如下所示: public int compare(MyClass left, MyClass right) { if (left == null) { return right == null ? 0 : 1; } if (right == null) { return -1; } //

我有一个比较器,在比较两个对象的内容之前检查它们的“null”。 比较方法如下所示:

    public int compare(MyClass left, MyClass right) {
        if (left == null) {
            return right == null ? 0 : 1;
        }
        if (right == null) {
            return -1;
        }
        // do some other comparing
    }
当我通过sonar代码质量检查工具运行此命令时,它会在if语句中报告“不兼容位掩码”错误。(它读起来像:“正确性-不兼容位掩码:不兼容位掩码在(e | 0x1=0x0)中产生常量结果…比较(MyClass,MyClass)我看不出这是怎么回事。有人能解释一下吗?这是假阳性吗


顺便说一句,我使用的声纳版本是2.6。

我相信我知道发生了什么。我相信你的代码是由Clover编写的,而Clover代码是对代码的修饰,它的方式不是很干净

44: sipush  14625
47: invokevirtual   #10; //Method com_cenqua_clover/CoverageRecorder.iget:(I)I
50: ifeq    57
53: iconst_1
54: goto    58
57: iconst_0
58: iconst_1
59: ior
60: ifne    85
这正是FindBugs所抱怨的

public int compare(MyClass left, MyClass right) {

    if (left == null) {
        return right == null ? 0 : 1;
    }
    if (right == null) {
        return -1;
    }
    // do some other comparing
}
这段代码甚至不应该编译,因为在方法签名中,您已经同意此方法将返回int类型,但因为它只有if语句,所以在某些情况下它甚至可能不返回值


现在来谈谈“不兼容位掩码”问题,这是因为for(right==null)该方法似乎返回两个值,即0和1,尽管这两个值不是同时返回的。在您的工具sonar代码质量检查中,该方法似乎返回两个不同的值进行相同的比较,因此一个值有时可能会隐藏另一个值。

哇,您确定这是有问题的方法吗?您确定它不在“做一些其他比较”你能发布javap-v的输出吗?我不使用sonar。它检查源代码还是字节码?我会在这里尝试使用parens:
return(right==null)?0:1;
-这可能会让人困惑?哇!我对Java字节码了解不多,但我相信你已经回答了这个问题。我确实在构建中进行了Clover检查,我开始怀疑Clover和sonar(Findbugs报告)之间的一些交互作用是导致“误报”的原因。“如果发现代码分析工具不理解Java中的?:运算符,我会感到震惊,这似乎就是您在这里所说的。嘿,HiiII,我认为您没有意义…………静态分析代码分析方法可能会为相同的值返回两个值(右==null)这就是为什么它给出了不兼容的位掩码。。。。。。。。。。