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

03_Mybatis-Plus LambadaQueryWrapper 表达式爆空指针异常

🌟 03_MyBatis-Plus LambdaQueryWrapper 爆出空指针异常的坑点分析

❓ 场景描述

来看一段常见的 MyBatis-Plus 查询写法,是否存在问题?

Page<VideoInfoVo> videoInfoVosPage = videoMapper.selectPage(page, new LambdaQueryWrapper<VideoInfoVo>().eq(videoAdtReq.getUserId() != null, VideoInfoVo::getUserId, videoAdtReq.getUserId()).ge(videoAdtReq.getStartTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getStartTime().atStartOfDay()).le(videoAdtReq.getEndTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getEndTime().atTime(LocalTime.MAX))
);

💥 问题分析:会爆出 NullPointerException!

🔍 错误点在哪?

.ge(videoAdtReq.getStartTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getStartTime().atStartOfDay())
.le(videoAdtReq.getEndTime() != null, VideoInfoVo::getUpdateTime, videoAdtReq.getEndTime().atTime(LocalTime.MAX))

表面上看已经做了非空判断,似乎没有问题,但实际上,这样写仍然可能爆出 NullPointerException


🚨 关键误区:Java 的参数求值顺序

Java 会在调用方法前,先对所有参数进行求值,然后再把这些值传给方法体。

所以即使你写了:

videoAdtReq.getStartTime() != null

Java 仍然会执行

videoAdtReq.getStartTime().atStartOfDay()

如果 getStartTime() 返回的是 null,那 .atStartOfDay() 立即爆 NPE


✅ 正确写法:提前提取变量,避免链式空指针

LocalDateTime start = null;
LocalDateTime end = null;if (videoAdtReq.getStartTime() != null) {start = videoAdtReq.getStartTime().atStartOfDay();
}
if (videoAdtReq.getEndTime() != null) {end = videoAdtReq.getEndTime().atTime(LocalTime.MAX);
}Page<VideoInfoVo> videoInfoVosPage = videoMapper.selectPage(page, new LambdaQueryWrapper<VideoInfoVo>().eq(videoAdtReq.getUserId() != null, VideoInfoVo::getUserId, videoAdtReq.getUserId()).ge(start != null, VideoInfoVo::getUpdateTime, start).le(end != null, VideoInfoVo::getUpdateTime, end)
);

🧠 小结 Tips

写法是否安全原因
.eq(cond, field, value)✅ 安全不涉及链式 null 调用
.ge(cond, field, value.atStartOfDay())❌ 危险即使 cond == falsevalue.atStartOfDay() 已执行

📌 建议

  • 所有可能为 null 的链式操作都要提前拆解;
  • 不要在 .ge().le().like() 等条件方法内部写链式 null 调用
  • 最好在写查询条件前,先准备好转换后的数据变量。

相关文章:

  • 大数据应用开发和项目实战-Seaborn
  • Python-pandas-操作csv文件(读取数据/写入数据)及csv语法详细分享
  • python + segno 生成个人二维码
  • 模拟频谱分析仪(Linux c++ Qt)
  • Qt:(创建项目)
  • PageOffice在线打开word文件,并实现切换文件
  • 【RustDesk 】中继1:压力测试 Python 版 RustDesk 中继服务器
  • 阿里云 ECS 服务器进阶指南:存储扩展、成本优化与架构设计
  • WPF之RadioButton控件详解
  • AI Agent新范式:FastGPT+MCP协议实现工具增强型智能体构建
  • 【Python学习路线】零基础到项目实战系统
  • 论文阅读:2024 ICML In-Context Unlearning: Language Models as Few-Shot Unlearners
  • 模型部署技巧(一)
  • WHAT - 《成为技术领导者》思考题(第四章)
  • Netflix系统架构解析
  • 基于Docker的Elasticsearch ARM64架构镜像构建实践
  • 解决GoLand无法Debug的问题
  • (Go Gin)Gin学习笔记(二):路由配置、基本路由、表单参数、上传单个文件、上传多个文件、浅扒路由原理
  • SMMU相关知识
  • 【蓝桥杯】第十六届蓝桥杯C/C++大学B组个人反思总结
  • 美国第一季度经济环比萎缩0.3%
  • 奔驰一季度利润降四成,受美国加征关税影响放弃全年盈利展望
  • 关于新冠疫情防控与病毒溯源的中方行动和立场
  • 山西太原一处居民小区发生爆炸,现场产生大量浓烟
  • 《求是》杂志发表习近平总书记重要文章《激励新时代青年在中国式现代化建设中挺膺担当》
  • 成都世运会倒计时100天,中国代表团运动员规模将创新高