Findbugs报告了一个不兼容的位掩码错误,但我不知道怎么回事

|| 我有一个比较器,在比较它们的内容之前,先检查两个对象的“ null”。 compare方法如下所示:
    public int compare(MyClass left, MyClass right) {
        if (left == null) {
            return right == null ? 0 : 1;
        }
        if (right == null) {
            return -1;
        }
        // do some other comparing
    }
当我通过声纳代码质量检查工具运行此程序时,它在if语句中报告“不兼容的位掩码”错误。 (它读为:\“正确性-不兼容的位掩码:(e | 0x1 = 0x0)中的不兼容的位掩码在.... Compare中产生常量结果。(比较MyClass,MyClass)我看不到这种情况。可以有人对此有所启示吗? 顺便说一句,我使用的声纳版本是2.6。     
已邀请:
我相信我知道发生了什么事。我相信您的代码正在被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类型,但是只有在有可能在某些情况下甚至可能不返回值的语句时,该方法才可以返回。 现在出现您的“不兼容的位掩码”问题,这是因为对于(正确== null),该方法似乎返回两个值,即0和1,尽管它们不是同时出现。在您的工具声纳代码质量检查中,似乎该方法为同一比较返回了两个不同的值,因此一个值有时可能会隐藏另一个值。     

要回复问题请先登录注册