You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 2调度方法日志未显示指定字符串问题咨询

问题分析:为什么日志中没有"start sendEmailOrders"字符串?

这是一个典型的Java运算符优先级坑,咱们一步步拆解来看:

先看你写的日志代码行:

log.info("start sendEmailOrders: " + factoryEmails != null ? String.valueOf(factoryEmails.size()) : "0");

Java里字符串拼接运算符+的优先级比三元运算符?:高,所以这行代码的实际执行逻辑完全不是你想的那样:

  1. 首先会执行 "start sendEmailOrders: " + factoryEmails,哪怕factoryEmails是null,拼接后也会得到"start sendEmailOrders: null"这个非null字符串
  2. 接着判断这个拼接后的字符串是否不等于null——结果永远是true
  3. 最后执行三元运算符的true分支,直接输出factoryEmails.size()的值(也就是你日志里看到的"2"),完全把前面的前缀字符串给"丢"了

更糟的是,如果factoryEmails真的是null,原来的代码还会触发NullPointerException(因为会去调用null.size()),只是这次刚好factoryEmails不为null,所以只出现了日志缺失的问题。

修复方案

给三元表达式加上括号,强制让它先执行,再和前缀字符串拼接:

log.info("start sendEmailOrders: " + (factoryEmails != null ? String.valueOf(factoryEmails.size()) : "0"));

这样执行顺序就符合你的预期了:先判断factoryEmails是否为null,得到对应的数量字符串,再和前缀拼接成完整的日志消息,最终输出类似start sendEmailOrders: 2的内容,同时还避免了潜在的NPE问题。

内容的提问来源于stack exchange,提问作者robert trudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:28:06