面向对象封装类型转换可规避NumberFormatException和NullPointerException:通过工具类提供toInt()等安全方法,预判空值与非法字符;用Optional显式表达可能为空;结合泛型与类型校验防止误转;注意包装类缓存与比较陷阱,优先使用基本类型或缓存值。

用面向对象方式配合包装类做类型转换,核心是把“转换逻辑”封装进类中,让调用方不直接面对 parseInt 或拆箱操作,从而规避 NumberFormatException 和 NullPointerException 这两类常见报错。
封装转换逻辑,统一处理异常
定义一个工具类或业务实体类,把字符串转数值的过程收口,内部捕获并转化为更明确的语义结果:
- 不直接暴露
Integer.parseInt(),而是提供toInt(String s, int defaultValue)方法 - 对空值、空白串、非数字字符提前判空或 trim,避免走到 parse 阶段就崩
- 异常不向上抛,而是返回默认值、Optional 或自定义结果对象(如
Result<Integer>)
用 Optional 替代 null 返回值
包装类本身可为 null,但直接拆箱风险高。用 Optional<Integer> 显式表达“可能无值”,强制调用方处理空场景:
Optional.ofNullable(str).filter(s -> !s.trim().isEmpty()).map(Integer::parseInt).orElse(null)- 搭配 map/flatMap 使用,链式过滤非法输入,天然跳过 null 和格式错误
- 避免在集合遍历中写
for (int x : list)——若 list 含 null,会触发 NPE;改用list.stream().mapToInt(i -> i).toArray()前先 filter non-null
结合泛型与类型校验,防止误转
当从外部来源(如 JSON、Map、数据库 ResultSet)读取数据时,值可能是 Object 类型,不能盲目强转:
- 先用
instanceof String或instanceof Number判断原始类型,再决定走 parse 还是 intValue() - 对 Map<String, Object> 中的值:若 key 对应值是
"123"字符串,就用Integer.valueOf();若是Long类型,则先转成 long 再缩容(注意精度) - 避免
(Integer) obj这种裸强转,一律走安全校验 + 显式转换路径
缓存与比较陷阱也要纳入设计
面向对象封装时,需意识到包装类自带行为特性,不能只当“透明容器”:
- 若类中缓存了
Integer字段用于状态判断,不要用==比较,统一用.equals()或Objects.equals(a, b) - 涉及范围判断(如年龄 ≥ 0 && ≤ 150),建议字段用
int存储,构造时由包装类安全转换后赋值,避免运行时反复拆箱 - 高频创建小整数(如循环索引)时,优先复用缓存区间(-128~127)内的值,或直接使用基本类型减少 GC 压力

















