Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FindBugs:长引用的可疑比较_Java_Findbugs - Fatal编程技术网

Java FindBugs:长引用的可疑比较

Java FindBugs:长引用的可疑比较,java,findbugs,Java,Findbugs,FindBugs在我的代码中识别出以下错误: 长参考文献的可疑比较 我曾尝试用谷歌搜索这个特定的错误,但没有成功。据我所知,比较数据类型为Long的字段应使用=运算符 if (materialDefinition.getId() == definitionToRemoveFromClass.getId()) { //... } 我确信这两个方法.getId()都返回一个Long 这真的是一个问题吗?如果是,我该如何解决 这真的是一个问题吗?如果是,我该如何解决 是的,您正在比较引用而不

FindBugs在我的代码中识别出以下错误:

长参考文献的可疑比较

我曾尝试用谷歌搜索这个特定的错误,但没有成功。据我所知,比较数据类型为
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());
}