当前位置:  开发笔记 > 编程语言 > 正文

为什么findbugs会在此代码中抛出空指针取消引用?

如何解决《为什么findbugs会在此代码中抛出空指针取消引用?》经验,为你挑选了1个好方法。

我通过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;

我觉得有点清楚.如果没有人同意这个改变,我会按照建议做,只是忽略这个问题,即使我宁愿避免这个.



1> T.J. Crowder..:

这个逻辑对于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设置中的一个例外(在这个问题的答案中描述).

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有