Java中if语句何时使用AND/OR?空指针解引用问题咨询
Java中&&与||的使用场景、效率分析及解引用问题解析
嘿,这个问题问到点子上了——刚好涉及Java逻辑运算符的核心特性,还有空值处理里的常见坑,我来一步步给你理清楚:
一、什么时候用&&(短路与),什么时候用||(短路或)?
Java里的&&和||是短路逻辑运算符,核心特点就是「一旦能确定最终结果,立刻停止执行后面的条件」,这也是它们和非短路的&、|最本质的区别。具体场景分两种:
- 用
&&的情况:当你需要所有条件都满足,而且前面的条件是后面条件的「安全闸门」时。比如你要调用对象的方法,必须先检查对象不为null;要访问数组元素,必须先检查数组不为null且长度大于0——这种情况下,&&能帮你在前面条件不成立时,直接跳过后面可能触发异常的操作。
举个例子:if (myList != null && !myList.isEmpty()),如果myList是null,后面的isEmpty()调用就不会执行,完美避免NullPointerException(NPE)。 - 用
||的情况:当你只需要满足任意一个条件就行时。比如判断用户是否符合优惠资格:if (user.isStudent() || user.isSenior()),如果用户已经是学生,后面的isSenior()就没必要执行了,既符合逻辑又节省计算资源。
二、针对if(firstName != null && !firstName.equals("")){}:用AND还是OR?效率与规范问题
首先拍板:这里必须用&&,完全不能用||——要是换成||,逻辑直接崩盘,还会炸NPE:
- 假设
firstName是null,firstName != null为false,用||的话会继续执行!firstName.equals(""),这时候你解引用了一个null对象,直接抛出NPE。 - 用
&&就没问题:如果firstName是null,第一个条件为false,后面的equals调用直接跳过,既保证逻辑正确,又避免了不必要的方法调用,效率自然更高。
这绝对不是个人偏好,是Java空值处理的基础规范:在调用对象方法/访问属性前,必须用短路与&&先做非空检查,把不安全的操作挡在后面。
三、这个语句的解引用问题?
你给出的原语句firstName != null && !firstName.equals("")本身已经完美避免了解引用问题——因为它把非空检查放在最前面,短路特性确保了null时不会执行equals。但如果写错顺序或者用错运算符,就会踩解引用的坑:
- 条件顺序搞反:如果写成
!firstName.equals("") && firstName != null,一旦firstName是null,会先执行firstName.equals(""),直接触发NPE——这就是典型的「解引用null对象」错误。 - 误用非短路的
&:要是把&&换成&,哪怕firstName是null,firstName != null为false,后面的!firstName.equals("")还是会执行,同样炸NPE,因为&会强制执行所有条件,不管前面的结果如何。
最后补个小技巧:Java 7+里可以用Objects.nonNull(firstName)替代firstName != null,可读性更好;如果项目里有Apache Commons Lang这类工具库,用StringUtils.isNotEmpty(firstName)能直接替代整个判断,简洁还不容易写错。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

