然而,我在我的代码中发现了一个潜在的缺陷,这让我感到有点惊讶。
下面是代码:
Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
mismatch = true;
看起来在某些情况下,即使值相等,它也似乎会错误地设置为不匹配。我在Eclipse中设置了断点,发现Integer
的值都为137,我检查了布尔表达式,它说是false,但是当我单步执行时,它却将mismatch设置为true。
将条件语句改为:
if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))
问题已解决。
有人能够解释一下为什么会出现这种情况吗?到目前为止,我只在我的个人PC上的本地主机上看到了这种行为。在这种特殊情况下,代码成功通过了大约20个比较,但在2个比较后失败了。该问题具有一致的可重现性。
如果这是普遍存在的问题,那么它应该会在我们的其他环境(dev和test)上引发错误,但到目前为止,在执行此代码片段的数百个测试中,没有人报告出现问题。
对于比较两个Integer
值,仍然不能使用==
吗?
除了下面所有很好的答案之外,以下stackoverflow链接提供了相当多的额外信息。实际上,它本来可以回答我最初的问题,但因为我没有在问题中提及装箱,所以它没有出现在选定建议中: