Java中short类型无内置溢出检查,需手动防护;应使用Short.MIN_VALUE/Short.MAX_VALUE代替魔数,并在转换前预检范围。

Java 中 short 类型本身不支持直接的安全数值计算——它没有内置溢出检查机制,所有运算都静默截断、自动回绕。所谓“安全”,必须靠开发者主动加防护,而不是依赖语言特性。
明确 short 的取值边界并用常量引用
不要硬编码 -32768 或 32767,而是始终使用 Short.MIN_VALUE 和 Short.MAX_VALUE。它们是编译期常量,语义清晰且可移植:
short max = Short.MAX_VALUE; // 32767short min = Short.MIN_VALUE; // -32768- 用于初始化、边界校验、单元测试断言等场景,避免魔数导致逻辑错误
运算前做范围预检,尤其在输入转换时
字符串或 int 转 short 极易出错。例如 Short.parseShort("32768") 直接抛 NumberFormatException;而 (short)32768 会静默变成 -32768。正确做法是先判断再转:
- 对 int 值:用
if (value >= Short.MIN_VALUE && value 校验后再强转 - 对字符串:先用
Integer.parseInt()解析为 int,再按上一步校验,最后转 short - 避免直接调用
Short.valueOf(String)——它内部仍会调用parseShort,同样抛异常
算术运算中防止隐式溢出
short 参与四则运算时,自动提升为 int,结果也是 int。这看似“安全”,但容易掩盖问题:
立即学习“Java免费学习笔记(深入)”;
-
short a = 32767, b = 1;→a + b结果是 int 类型的 32768,若强制赋给 short:short c = (short)(a + b);就得到 -32768 - 乘法更危险:
short x = 1000; short y = 1000;→x * y是 int 的 1_000_000,看似安全;但若值更大(如 5000 × 5000),结果虽仍是 int,后续若再转回 short 就会失真 - 建议:关键计算路径统一用
int或long进行中间运算,仅在确认结果仍在 short 范围内时才收缩存储
需要强校验时,用 Math.addExact 等工具方法
Java 8+ 提供了带溢出检测的数学工具类,虽然不直接支持 short,但可借助 int 版本实现安全封装:
-
int result = Math.addExact((int)a, (int)b);—— 若溢出则抛ArithmeticException - 校验通过后,再用
if (result >= Short.MIN_VALUE && result 判断是否可安全转回 short - 类似可用
Math.multiplyExact、Math.subtractExact


















