我有如下实现的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()
的正确方法是什么?
答案 0 :(得分:1)
这可能是FindBugs的一个限制;我同意您已涵盖所有基础,但您的空检查分为两个不同的条件。现在这些条件碰巧是互补的,所以如果a
为空,它们中的至少一个会触发,但是根据FindBugs的复杂程度,它可能无法识别它。
这里有两个选项:
只需忽略FindBugs警告即可。由于它的性质,会不时引起一些误报,所以如果你不认为重写是值得的,你不要觉得你必须重写你的代码才能让它100%满意根据其自身的优点。
如果您希望报告最后显示一个很好的大零,您可以使用@SuppressWarnings
annotation实际将此信息传达给FindBugs。有关示例,请参阅this question。
通过嵌套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);