Java && ||运算符优先级问题:修改参数后if判断仍返回true求助
Java if条件判断结果不符合预期问题解答
核心原因
你对条件的拆解错误,根本原因是不了解Java逻辑运算符的优先级:&&的优先级远高于||,运算时会先计算所有&&连接的表达式,再计算||连接的表达式。
条件拆解验证
表达式映射
你写的if条件可以拆分为以下几个子表达式:
- A =
sHeaderStatus.equals("1") - B =
canChangeSupplier == 1 - C =
(sHeaderStatus.equals("10") || sHeaderStatus.equals("14") || sHeaderStatus.equals("85") || sHeaderStatus.equals("86") || sHeaderStatus.equals("87")) - D =
hasButton - E =
editableLineStatus - F =
!sHeaderStatus.equals("85") - G =
sFrom.equals("APPROVAL")
原if条件的逻辑等价于:
(A || (B && C) || (D && E && F)) || G
代入参数计算
你两次运行的公共参数取值:
- A =
true(sHeaderStatus固定为"1") - B =
false(canChangeSupplier固定为0) - C =
false(sHeaderStatus是"1",不在C的取值范围内) - D =
false(hasButton固定为false) - G =
false(sFrom固定为"REQ")
计算步骤:
- 先算所有
&&表达式:- B && C =
false && 任意值 = false - D && E && F =
false && 任意值 = false(D本身是false,E取true或false完全不影响这段结果)
- B && C =
- 再算
||表达式:- 括号内部分:A || false || false =
true - 整体条件:true || G =
true
- 括号内部分:A || false || false =
所以不管你修改editableLineStatus为任意值,整个if条件的结果永远是true,自然会一直输出true11。
优化建议
写复杂逻辑判断时,不要依赖运算符默认优先级,主动用括号明确你想要的运算顺序,避免出现逻辑漏洞。比如如果你原本期望的判断逻辑是(A || B) && C && ...,必须给A||B加上括号才能生效。
内容的提问来源于stack exchange,提问作者Ankush Jassal
相关产品推荐
相关产品推荐

