当前位置: 首页 > news >正文

Java 项目里的那些坑

1)NullPointerException 不是最大的问题,“被吞掉的 NPE” 才是

  • 现象:接口偶发返回默认值/空列表,日志无异常,但业务数据不对。

  • 根因:在 catch (Exception e){} 里吞异常,或 Optional.orElseGet() 里调用了含 NPE 的逻辑。

  • 规避

    • 严禁“裸 catch”;NPE 统一加业务语义并打点。

    • 使用 Objects.requireNonNull 在入口处早失败。

// 入口防御式校验 UserInput in = Objects.requireNonNull(req.getInput(), "input is required");


2)BigDecimal 的两大雷:构造方法比较

  • 现象:金额出现 0.3000000000004 或 equals 比较失败。

  • 根因new BigDecimal(0.1) 用了 double;equals 比较精度和数值。

  • 规避

    • BigDecimal.valueOf(double) 或字符串构造。

    • 金额比较用 compareTo,显示用统一 setScale

BigDecimal a = BigDecimal.valueOf(0.1); BigDecimal b = new BigDecimal("0.2"); a.add(b).setScale(2, RoundingMode.DOWN); if (a.compareTo(b) == 0) { /* equal by value */ }


3)equals/hashCode + 可变字段 = 散列表噩梦

  • 现象:元素“神秘”从 HashSet 里消失,HashMap 查不到值。

  • 根因:作为 key 的对象放进 Map 后,参与 hash 的字段被修改。常见于 Lombok @Data 默认把所有字段纳入 equals/hashCode

  • 规避

    • key 对象设计成不可变(final 字段,去 setter)。

    • Lombok 明确指定:@EqualsAndHashCode(of = {"id"})

@Value // Lombok 不可变对象 public class UserKey { Long id; }


4)自动装箱陷阱:== 比较 Integer

  • 现象Integer 比较在 [-128,127] 内“看似正确”,其他值就错。

  • 规避一律用 Objects.equals(a, b),或先拆箱比较基本类型。


5)时区/时间:开发好好的,上线全乱了

  • 现象:当天订单跑到前一天/后一日;定时任务错点。

  • 根因:使用 LocalDateTime 存库、机房/容器默认时区不同、MySQL timestampdatetime 混用。

  • 规避

    • 服务统一使用 UTC 存储(数据库、MQ),展示再转换。

    • 明确 JVM 启动参数:-Duser.timezone=UTC

    • Java 端用 ZonedDateTime / Instant;MySQL 用 timestamp 并统一时区。

http://www.dtcms.com/a/593122.html

相关文章:

  • 【读书笔记】NVIDIA DGX
  • 岑溪网站开发工作室宁波网站制作公司费用价格
  • 揭阳智能模板建站海口百度seo公司
  • 智能SQL优化工具 PawSQL 月度更新 | 2025年10月
  • 烟台市网站建设用电脑怎么做原创视频网站
  • Total PDF Converter v6.5.0.356.0 电脑PDF多功能转换器
  • 【Android】MVVM实战:仿Launcher加载与应用过滤
  • seowhy什么意思丹阳seo公司
  • 质量智能革命:SPC软件助力中国制造驶入高质量发展快车道
  • 步骤记录器广州搜索排名优化
  • 3分钟搞定,CI/CD工具Arbess安装和配置
  • 5G智慧矿山监控终端:引领矿山智能化新潮流 在科技浪潮汹涌澎湃的当下,矿山行业正处于智能化转型的关键转折点
  • oracle 11查询数据库锁
  • 网站后台模板免费海外网站服务器网址
  • Oracle dblink 连接TDSQL-PG,及乱码处理
  • [出现错误 2147942402 (0x80070002) (启动“ubuntu2004.exe”时)]
  • jdbc基础(工具类)
  • 生物电子实验箱 生物医学教学平台 嵌入式生物医学电子实验箱 医疗电子试验箱
  • 长沙做网站微联讯点很好wordpress百度云直链
  • YOLOv5(四):models/experimental.py
  • TCP/IP协议:互联网的基石与通信灵魂
  • 进程间消息通信RegisterWindowMessage(C++源码)
  • Redis进阶 - 数据结构底层机制
  • 基于YOLO11深度学习的电动车头盔检测系统【Python源码+Pyqt5界面+数据集+安装使用教程+训练代码】【附下载链接】
  • 在 React 生态中,有多个成熟的 虚拟列表 npm 库
  • 攻防世界-Misc-Test-flag-please-ignore
  • 研发管理知识库(2)华为管理模式和《华为基本法》
  • 网站开发项目任务html编辑器安卓版下载
  • python程序封装成exe文件
  • JavaEE 进阶第六期:Spring Boot 如何重塑后端开发