java整数除法会截断小数而非四舍五入,如5/2得2、-5/2得-2;(double)(5/2)先整除再转类型仍为2.0,正确写法是5.0/2或(double)5/2。

识别和避开Java运算符常见陷阱,关键不是背优先级表,而是盯住“结果和预期不一致”这个信号。很多bug不是编译报错,而是运行时逻辑悄悄偏移——比如金额算错、条件跳过、字符串拼接异常。下面几类最常出问题的场景,按实际发生频率和危害程度整理出来。
整数除法与类型截断
两个整数相除,结果自动截断小数部分,不会四舍五入,也不会转成浮点数。
-
典型表现:
int a = 5 / 2;得到2,不是2.5;-5 / 2得到-2,不是-3 -
易错写法:
(double)(5 / 2)—— 先整除再转类型,结果仍是2.0 -
安全做法: 至少让一个操作数带小数点,如
5.0 / 2或(double)5 / 2
== 误用于对象比较
用 == 比较字符串、包装类(Integer、Boolean等)或自定义对象,比的是内存地址,不是内容或值。
-
典型表现:
"abc" == "abc"有时为true(字符串常量池优化),但new String("abc") == "abc"一定为false -
易错写法:
if (str1 == str2)、if (num1 == num2)(num1/num2是Integer且值在-128~127外) -
安全做法: 字符串用
.equals();可能为null时用Objects.equals(str1, str2);基本类型才用==
浮点数直接用 == 判断相等
二进制无法精确表示大部分十进制小数,导致 0.1 + 0.2 != 0.3 成为经典陷阱。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
典型表现:
System.out.println(0.1 + 0.2 == 0.3);输出false -
易错写法: 在金融、计费、精度敏感场景中用
==比较double/float -
安全做法: 用
BigDecimal做精确计算;或用误差范围比较:Math.abs(a - b)
位运算与比较混用、括号缺失
位运算符(&、|)优先级低于比较运算符(==、),不加括号极易被误读。
-
典型表现:
if (flags & MASK == VALUE)实际执行的是flags & (MASK == VALUE),逻辑完全错误 - 易错写法: 忘记给位运算表达式加括号,尤其在条件判断里嵌套使用
-
安全做法: 所有含位运算的判断,一律显式加括号:
if ((flags & MASK) == VALUE)
自增/自减与赋值组合的歧义
前缀(++i)和后缀(i++)在复合表达式中行为不同,容易混淆执行顺序。
-
典型表现:
int i = 1; int j = i++ + ++i;结果是4,但很多人预估为3或5 -
易错写法: 在同一表达式中多次修改同一变量,如
a[i++] = i++ - 安全做法: 避免在单条语句中对同一变量做多次增减;拆成多步更清晰、更可维护
这些陷阱大多不报错,也不抛异常,只在特定数据或边界条件下暴露。养成“看到运算就问一句:类型是什么?优先级怎么走?有没有隐式转换?”的习惯,比死记规则更管用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










