Java中if条件有无括号的运行差异及数组越界问题求解
这是Java逻辑运算符优先级和短路规则共同作用的结果,具体原因如下:
前置基础规则
- Java中
&&(逻辑与)的运算优先级高于||(逻辑或),运算时会优先计算&&关联的表达式 &&短路规则:仅当左侧表达式结果为true时,才会执行右侧表达式;如果左侧为false,直接跳过右侧表达式计算||短路规则:仅当左侧表达式结果为false时,才会执行右侧表达式;如果左侧为true,直接跳过右侧表达式计算
第一段代码异常原因
第一段代码原文:
if ((idx >= 0) && (open[idx] == '(') || (open[idx] == '{')) {
由于&&优先级更高,代码实际的运算分组等价于:
if ( ( (idx >= 0) && (open[idx] == '(') ) || (open[idx] == '{') ) {
当idx = -1时执行逻辑:
- 先计算
||左侧的(idx >=0) && (open[idx] == '('):idx >=0结果为false,&&触发短路,这部分整体返回false - 此时
||左侧为false,需要继续计算右侧的open[idx] == '{',直接访问open[-1]触发数组越界异常
第二段代码正常运行原因
第二段代码原文:
if ((idx >= 0) && ((open[idx] == '(') || (open[idx] == '{'))) {
代码通过括号显式调整了运算分组,实际逻辑等价于:
if ( (idx >= 0) && ( (open[idx] == '(') || (open[idx] == '{') ) ) {
当idx = -1时执行逻辑:
- 先计算
&&左侧的idx >=0,结果为false,&&直接触发短路,完全不会执行右侧的数组访问逻辑,因此不会出现越界异常
内容的提问来源于stack exchange,提问作者songsong
相关产品推荐
相关产品推荐

