相同值的比较¶
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. 数值相等性运算符。