我对其他人编写的现有代码有疑问,我认为这些代码有问题。需要你的建议,
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。
请建议。
答案 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
不会被抛出,所以你是对的,这是一个错误。