Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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_Double_Findbugs_Boxing_Reference Type - Fatal编程技术网

Java FindBugs:双重参考的可疑比较

Java FindBugs:双重参考的可疑比较,java,double,findbugs,boxing,reference-type,Java,Double,Findbugs,Boxing,Reference Type,我有一种方法,它将两个加倍a和b(注意大写字母“D”)并计算差值。如果只有一个参数为null,则结果应为9999999,否则将返回两个数字之间的差值 下面的(工作)代码在FindBugs中给了我一个“可怕”的警告,我通常试图避免代码中出现高级别的警告。然而,我认为代码既短又可读,而我所能想到的其他一切只会使其可读性降低。在这种情况下,IMHO使用==是完全正确的 该行的FindBugs报告: 错误:对中的双重引用进行可疑比较 Main.foo(双人,双人) 此方法使用==或!=比较两个参考值操作

我有一种方法,它将两个
加倍
a
b
(注意大写字母“D”)并计算差值。如果只有一个参数为
null
,则结果应为
9999999
,否则将返回两个数字之间的差值

下面的(工作)代码在FindBugs中给了我一个“可怕”的警告,我通常试图避免代码中出现高级别的警告。然而,我认为代码既短又可读,而我所能想到的其他一切只会使其可读性降低。在这种情况下,IMHO使用
==
是完全正确的

该行的FindBugs报告:

错误:对中的双重引用进行可疑比较 Main.foo(双人,双人)

此方法使用==或!=比较两个参考值操作人员 比较此类实例的正确方法通常是 使用equals()方法。可以创建不同的实例 它们相等,但不作为==进行比较,因为它们不同 物体。通常不应通过以下方式进行比较的类别示例: 参考是java.lang.Integer、java.lang.Float等

置信度:高,等级:最恐怖(1)模式:RC\u参考\u比较类型: RC,类别:正确性(正确性)


你知道如何在没有警告的情况下将代码重写得简洁明了吗?

==
检查两个引用是否引用了相同的对象。但是,您必须检查两者是否具有相同的值。所以使用
.equals()
方法

public double foo(Double a, Double b) {
    return (a != null && a.equals(b)) ? 0 : (a != null && b != null) ? b - a : 999999;
}

从长远来看,我建议采取更多的步骤来实现同样的、易于维护的功能

public double foo(Double a, Double b) {

    //as per Marco suggestion. but not sure OP wants the same.
    if(a == null && b == null){
          return 0;
    } 
    //END
    if(a == null || b == null){
          return 999999;
    }    
    return b-a;  //will return 0 if they are equal. no extra checks required
}
。。。而我能想到的其他一切都让它不那么可读

根据您是否喜欢可读性而不是正确性,您可以考虑

public double foo(Double a, Double b) 
{
    if (a == null)
    {
        if (b == null)
        {
            return 0;
        }
        return 999999;
    }
    if (b == null)
    {
        return 999999;
    }
    return b - a;
}
顺便说一句:这个
999999
看起来可疑。也许这应该是双精度正无穷大或双精度最大值,但这取决于预期用途。

这样如何:

public static void main(String[] args) {
    print(null, null);
    print(5.0, null);
    print(null, 2.0);
    print(5.0, 2.0);
}

public static void print(Double a, Double b) {
    System.out.printf("a=%f, b=%f result=%f\n", a, b, foo(a, b));
}

public static double foo(Double a, Double b) {
    return a == null
            ? b == null ? 0 : 9999
            : b == null ? 9999 : b - a;
}
输出:

a=null,     b=null     result=0.000000
a=5.000000, b=null     result=9999.000000
a=null,     b=2.000000 result=9999.000000
a=5.000000, b=2.000000 result=-3.000000

这可能会在
a.equals(
@harmlez:Corrected.@Harmlezz和a==b如何?看看我的(脏的)解决方案:)处导致NullPointerException,但它可以工作(三元恐怖)检查引用相等性在这里是正常的。它只捕获两个参数都为
null
的情况。如果两者都有相同的值,减法将得到0。你不需要太多重复的代码。检查我的解决方案。正如您的答案评论中提到的,简单明了:这取决于比较两个
null
值应该是
0
还是
999999
(这并不意味着代码不能写得更短,但我认为我的解决方案是清晰易懂的。我不喜欢嵌套的三元
?:
语句和其他体操。代码应该读起来像散文一样。根据初始代码,比较两个
null
应该得到
0
而不是
99999)…事实上,这可能被认为比我对这个案例的回答更简洁。为了证明我的两步方法的合理性:我仍然想知道像
d(null,b)=-无穷大
d(a,null)这样的东西=+Infinity
可能不太合适,但这是只有提问者才能决定的……好吧,我已经决定了。谢谢你。@Marco13我留下了魔法数字99999。代码用于创建带有比较结果的excel表,
+/-Infinity
显示为
@Axel,然后你可以选择nsider
Double.MAX_VALUE
-Double.MAX_VALUE
,但我不知道excel会从中得出什么结论……这没有直接关系,但其他代码检查工具(如PMD)会抱怨你那里的“神奇数字”(999999),因为它不清楚它的含义,如果你不得不在其他地方使用它,很容易键入错误(Harmlez的答案是9999,例如:-)。最好使用一个全名有意义的常数,比如DIFFERENCE,WHEN,NULL或MAX,DIFFERENCE是的,当然是这样。考虑了一会儿,如果你想
foo(NULL,NULL),我想你的代码是正确的
产生
0.0d
作为结果。通常,使用
=
比较
Double
对象表示程序员错误(
=
比较引用,而不是
Double
s值!)。因此,对于这种特殊情况,您可以忽略FindBugs警告。
a=null,     b=null     result=0.000000
a=5.000000, b=null     result=9999.000000
a=null,     b=2.000000 result=9999.000000
a=5.000000, b=2.000000 result=-3.000000