Java FindBugs:长引用的可疑比较
FindBugs在我的代码中识别出以下错误: 长参考文献的可疑比较 我曾尝试用谷歌搜索这个特定的错误,但没有成功。据我所知,比较数据类型为Java FindBugs:长引用的可疑比较,java,findbugs,Java,Findbugs,FindBugs在我的代码中识别出以下错误: 长参考文献的可疑比较 我曾尝试用谷歌搜索这个特定的错误,但没有成功。据我所知,比较数据类型为Long的字段应使用=运算符 if (materialDefinition.getId() == definitionToRemoveFromClass.getId()) { //... } 我确信这两个方法.getId()都返回一个Long 这真的是一个问题吗?如果是,我该如何解决 这真的是一个问题吗?如果是,我该如何解决 是的,您正在比较引用而不
Long
的字段应使用=
运算符
if (materialDefinition.getId() == definitionToRemoveFromClass.getId()) {
//...
}
我确信这两个方法.getId()
都返回一个Long
这真的是一个问题吗?如果是,我该如何解决
这真的是一个问题吗?如果是,我该如何解决
是的,您正在比较引用而不是值,因此两个具有相同值的不同Long
实例将导致该比较为false
。您应改为使用:
如果getId()
可以返回null
,那么也要确保包含适当的null
检查(尽管getId()
听起来不像是应该返回null
)的方法。如果(materialDefinition.getId().equals)(definitionToRemoveFromClass.getId())
确保materialDefinition.getId()
不为空
要比较这些值(<>),可以使用.compareTo()
方法:
A==B:A.与(B)==0相比
AA.与(B)<0
A>B:
A.compare to(B)>0
您可能需要这样做
public static boolean equals(Long a, Long b){
if (a==null && b==null) return true;
else if ((a==null) != (b==null)) return false;
else return a.equals(b);
}
是的,这是一种难闻的气味,您应该使用
equals()
方法,正如上面@arshajii所解释的那样
我发现最有趣的事实是,这种比较有时甚至会起作用,比如从较小的值(-128到127)开始,并且会在较大的数字时中断。例如:
@Test
public void compareSmallIds() {
Long id1 = 127L;
Long id2 = 127L;
Assert.assertTrue(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}
@Test
public void compareIds() {
Long id1 = 500L;
Long id2 = 500L;
Assert.assertFalse(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}
这种行为似乎基于数字缓存策略定义,默认为字节值范围。但毫无疑问,具有非原语值的代码不应依赖
=
运算符进行值比较 这些long是基元类型还是对象?(java.lang.Long)它们是两种不同的东西在哪个版本的FindBugs中定义了此规则?我在3.0.1()版本的描述列表中找不到它,为了增强代码安全性,我想激活它。或者只使用对象。等于(a,b)
。
@Test
public void compareSmallIds() {
Long id1 = 127L;
Long id2 = 127L;
Assert.assertTrue(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}
@Test
public void compareIds() {
Long id1 = 500L;
Long id2 = 500L;
Assert.assertFalse(id1 == id2);
Assert.assertTrue(id1.equals(id2));
Assert.assertTrue((long) id1 == (long) id2);
Assert.assertTrue(id1.longValue() == id2.longValue());
}