【发布时间】:2011-11-06 21:53:27
【问题描述】:
我有如下实现的 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()的正确方法是什么?
【问题讨论】:
-
从描述中,听起来它不喜欢这样一个事实,即如果其中一个为空,则对象是不同的(如果 a == null,IE 返回 -1 , 这掩盖了 a == null) 的事实。
-
Comparable 是一个泛型类型。 A和B的类型参数一样吗?否则,您可能会在运行时遇到一些有趣的错误,因为 compareTo 仅用于在具有相同类型的对象上调用。另外,为什么你首先需要这个辅助方法?当一个元素为空时提供排序?
-
静态分析工具并非万无一失——它们有时会而且确实会产生误报