我通过Sonarqube在我们的代码上运行findbugs,我得到一个空指针取消引用的错误:
有一个语句分支,如果执行,则保证将取消引用空值.
错误的代码就是这样:
public static boolean isBigDecimalDifferent(BigDecimal x, BigDecimal y) { return (x != null || y != null) && ((x != null && y == null) || (x == null && y != null) || x.compareTo(y) != 0); }
我想知道这是怎么可能的.唯一可以实现NPE的地方是调用x.compareTo(y),但如果x = null,那么Java永远不会分析那个分支,对吗?
这是一个错误,还是我错过了Java分析这个语句的方式?
UPDATE
感谢您的投入.我最后建议他们改变它:
if (x!=null && y != null) return x.compare(y); else return x!=y;
我觉得有点清楚.如果没有人同意这个改变,我会按照建议做,只是忽略这个问题,即使我宁愿避免这个.
这个逻辑对于FindBugs来说太复杂了,它在这里弄错了.你是对的,你已经防范null
了该代码中的解除引用.
我会简化它,所以FindBugs理解它,所以任何后来的人类读者也可以轻松地弄清楚它在做什么:
public static boolean isBigDecimalDifferent(BigDecimal x, BigDecimal y) { if (x == null) { return y != null; } if (y == null) { return x != null; } return x.compareTo(y) != 0; }
旁注:通常,您有一种检查相等性的方法,!
如果要检查不等式,请使用.
你在评论中说过:
不幸的是,这是我无权改变的遗留代码(我希望我可以!)
然后你必须注意FindBugs无法解决它,并使它成为FindBugs设置中的一个例外(在这个问题的答案中描述).