相同值的比较¶
ID: java/comparison-of-identical-expressions
Kind: problem
Security severity:
Severity: error
Precision: very-high
Tags:
- reliability
- correctness
- logic
Query suites:
- java-security-and-quality.qls
如果比较两个相同表达式(即检查相等性或不相等性),这通常表示错误,因为比较的布尔值始终相同。通常,它表示在字段访问中使用了错误的限定符。
浮点变量与其自身的不相等 (!=
) 和相等 (==
) 测试例外:特殊浮点值 NaN
(“非数字”)是唯一不被视为等于自身的值。因此,其中 x
是 float
或 double
变量的测试 x != x
等效于检查 x
是否为 NaN
,对于 x == x
也是如此。
建议¶
将值与其自身进行比较永远不是好习惯。如果您需要恒定行为,请使用布尔文字 true
和 false
,而不是将其模糊地编码为 1 == 1
或类似内容。
如果浮点变量使用不等式测试(使用 !=
)是故意的,则应将其替换为 Double.isNaN(...)
或 Float.isNaN(...)
以便于阅读。同样,如果浮点变量使用相等性测试(使用 ==
)是故意的,则应将其替换为 !Double.isNaN(...)
或 !Float.isNaN(...)
。
示例¶
在下面的示例中,Customer
的原始版本将 id
与 id
进行了比较,该比较始终返回 true
。更正后的 Customer
版本在将 id
与 o.id
进行比较时包含了缺少的限定符 o
。
class Customer {
...
public boolean equals(Object o) {
if (o == null) return false;
if (Customer.class != o.getClass()) return false;
Customer other = (Customer)o;
if (!name.equals(o.name)) return false;
if (id != id) return false; // Comparison of identical values
return true;
}
}
class Customer {
...
public boolean equals(Object o) {
if (o == null) return false;
if (Customer.class != o.getClass()) return false;
Customer other = (Customer)o;
if (!name.equals(o.name)) return false;
if (id != o.id) return false; // Comparison corrected
return true;
}
}
参考¶
帮助 - Eclipse 平台:Java 编译器错误/警告首选项。
Java 语言规范:15.21.1. 数值相等性运算符。