FindBugs:Double引用的可疑比较

时间:2014-04-02 09:42:33

标签: java double findbugs boxing reference-type

我有一个方法需要两个Doubles ab(注意大写'D')并计算差异。如果只有一个参数是null,则结果应为999999,否则将返回两个数字之间的差异。

以下(工作)代码在FindBugs中给出了一个“可怕”警告,我通常会尝试避免代码中的高级别警告。但是,我认为代码既简短又易读,而我能想到的其他一切只会降低其可读性。使用==的恕我直言在案例中完全正确。

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

该行的FindBugs报告:

  

Bug:可疑的双引用比较   Main.foo(双人,双人)

     

此方法使用==或!=运算符比较两个参考值,   通常情况下,比较这种类型的实例的正确方法   使用equals()方法。可以创建不同的实例   这是相同的,但不作为==进行比较,因为它们是不同的   对象。一般不应该比较的类的例子   引用是java.lang.Integer,java.lang.Float等。

     信心:高,等级:最可怕(1)模式:RC_REF_COMPARISON类型:   RC,类别:正确(正确性)

任何想法如何在没有警告的情况下干净简单地重写此代码?

4 个答案:

答案 0 :(得分:3)

我建议采取更多步骤来做同样的事情,从长远来看易于维护

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
}

答案 1 :(得分:2)

==检查两个引用是否引用相同的对象。但是,你必须检查两者是否具有相同的值。因此,请使用.equals()方法

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

答案 2 :(得分:2)

  

......以及我能想到的其他一切只会降低其可读性

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

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;
}

BTW:这999999看起来很可疑。也许这应该是Double.POSITIVE_INFINITYDouble.MAX_VALUE左右,但确定它取决于预期用途。

答案 3 :(得分:1)

这样怎么样:

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