实现compareObjects()的正确方法是什么

时间:2011-08-30 15:14:55

标签: java compare

我有如下实现的compareObjects方法

public static int compareObjects(Comparable a, Comparable b){

        if (a == null && b == null){
            return 0;
        } else if (a == null && b != null){
            return -1;
        } else if (a != null && b == null){
            return 1;
        } else {
            return a.compareTo(b);
        }
    }

当我通过findBugs运行时,我在行return a.compareTo(b)上得到了这个建议:

  

有一个语句分支,如果执行,则保证将取消引用空值,这将在执行代码时生成NullPointerException。当然,问题可能是分支或语句不可行,并且不能执行空指针异常;决定这超出了FindBugs的能力。由于此值先前已针对零点进行了测试,因此这是一个明确的可能性。

此时a永远不能为空。为什么FindBugs会向我展示这个建议?我怎么能纠正这个;实施compareObjects()的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

这可能是FindBugs的一个限制;我同意您已涵盖所有基础,但您的空检查分为两个不同的条件。现在这些条件碰巧是互补的,所以如果a为空,它们中的至少一个会触发,但是根据FindBugs的复杂程度,它可能无法识别它。

这里有两个选项:

  1. 只需忽略FindBugs警告即可。由于它的性质,不时引起一些误报,所以如果你不认为重写是值得的,你不要觉得你必须重写你的代码才能让它100%满意根据其自身的优点。

    如果您希望报告最后显示一个很好的大零,您可以使用@SuppressWarnings annotation实际将此信息传达给FindBugs。有关示例,请参阅this question

  2. 通过嵌套a块来重构条件,以便if上的无效性检查更明确:

    if (a == null) {
       return b == null ? 0 : -1;
    }
    return b == null ? 1 : a.compareTo(b);
    

    根据您的口味和风格,可能是更好的重写,更明确地说“如果a为空,请执行计算并返回,否则执行< em>此计算“。如果您愿意,您当然可以将三元条件更改为另一个if-else块。

答案 1 :(得分:1)

我想这可能是因为你不需要额外的&amp;&amp;声明。在第一个if语句之后,您已经知道其中一个是null。

public static int compareObjects(Comparable a, Comparable b){

    if (a == null && b == null){
        return 0;
    } else if (a == null){
        return -1;
    } else if (b == null){
        return 1;
    } else {
        return a.compareTo(b);
    }
}

答案 2 :(得分:1)

再看一遍,试试这段代码:

if (a == null && b == null){
    return 0;
} 

if (a == null){
    return -1;
} 

if (b == null){
    return 1;
} 

return a.compareTo(b);