问题描述
||
我有一个比较器,在比较它们的内容之前,先检查两个对象的“ 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,尽管它们不是同时出现。在您的工具声纳代码质量检查中,似乎该方法为同一比较返回了两个不同的值,因此一个值有时可能会隐藏另一个值。