逻辑OR运算符错误 - | vs | |

时间:2015-12-09 07:04:49

标签: java

我对其他人编写的现有代码有疑问,我认为这些代码有问题。需要你的建议,

if (encounter.getProvider() == null | encounter.getProvider().getIdentity() == null) {
            errorMessages.add("Provider information is incomplete");
        }

encounter.getProvider()是一种Employee类型的Object,在Encounter中允许为null。我在编写单元测试时遇到了问题,原始开发人员不再在这里工作了。

问题是即使encounter.getProvider() == null为真,那么第二个条件被评估并抛出一个NPE,所以我认为运算符应该更改为逻辑OR(| |),这样如果encounter.getProvider() == null为真,那么第二个不评估条件(encounter.getProvider().getIdentity() == null)并避免使用NPE。 我说错了吗?  或原始开发人员可能会考虑使用单个管道逻辑OR?

encounter.getProvider().getIdentity()

返回类型为Identity的对象。我用逻辑OR运算符(| |)测试了代码,如果第一个操作数是true,我就不会得到NPE。

请建议。

2 个答案:

答案 0 :(得分:3)

logical-OR is short circuit,意思是如果它是first argument evaluates to true, then the second argument is left unevaluated

bitwise operator无论如何都会评估它的两个参数。

所以它是错误的代码,请更改为添加||

好读Is there a difference between using a logical operator or a bitwise operator in an if block in Java?

答案 1 :(得分:1)

单个OR - |将评估下一个表达式而不管当前表达式的结果,而双重OR - ||将在满足真实条件时终止。

在您的情况下,只有当encounter.getProvider()不是null时,才会评估第二个条件并且NPE不会被抛出,所以你是对的,这是一个错误。