java运算符错误多因表达式被意外分组,应统一用括号显式断句;区分&(位运算/不短路)与&&(逻辑/短路);三元运算需boolean条件,自增避免副作用;用ide高亮、字节码或提取变量验证。

Java 运算符使用不当导致的错误,多数不报编译异常,却在运行时逻辑错乱、类型失配或行为反直觉。关键不是背优先级表,而是识别“表达式被意外分组”这一本质问题,并用可验证的方式主动防御。
括号显式断句,别赌编译器怎么想
只要表达式含两种及以上运算符类别(比如关系+位运算、算术+逻辑、逻辑+instanceof),一律加括号,不依赖记忆或默认优先级:
- 位掩码判断写 (flags & READ_MASK) == 0,不写
flags & READ_MASK == 0(后者先算==,结果是int & boolean,直接编译失败) - 字符串拼接混比较:写 "score: " + (a + b) > 100 不写
"score: " + a + b > 100(否则变成字符串与数字比大小,编译不过) - ! 和 == 相邻时:要否定整个等式,写 !(a == b),不写
!a == b(那是(!a) == b,语义完全不同)
区分 & 和 &&,该短路时绝不位运算
& 是位运算符,对 boolean 也做“按位与”,不短路;&& 才是逻辑与,支持短路——这是高频翻车点:
- 条件判断中写
obj != null & obj.toString().length() > 0→ 若 obj 为 null,右边仍执行,触发 NPE - 正确写法是 obj != null && obj.toString().length() > 0
- 仅当明确需要两边都求值(极少见)或做权限掩码计算(如
perms & WRITE != 0)时才用&
三元运算和自增,避免副作用藏在表达式里
三元运算要求条件部分必须是 boolean;自增运算在赋值/判断中混用,极易用错旧值:
- 写 flag = (i % 2 == 0) ? 1 : -1,不写
flag = (i % 2) ? 1 : -1(i%2是 int,不能当 boolean) - 限流计数别写
if ((count++ >= max))→ 比较的是旧值,多放行一次;改用 if (++count > max) 或拆成两行:count++; if (count > max) - 日志中写
log("try #" + count++)会导致序号滞后;应写log("try #" + count); count++;
用工具验证,别靠脑子推导
人工推断运算顺序容易出错,用确定性手段交叉验证:
- 把光标停在 IntelliJ 中的
a == b & c的b & c上,高亮范围即编译器认定的子表达式 - 执行
javap -c YourClass查看字节码:比如a || b && c编译后先算b && c,证实分组为a || (b && c) - 对存疑表达式提取变量:
int val = list.get(i) + 1; if (val ,既可调试又杜绝歧义
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











