Spring Boot 2调度方法日志未显示指定字符串问题咨询
问题分析:为什么日志中没有"start sendEmailOrders"字符串?
这是一个典型的Java运算符优先级坑,咱们一步步拆解来看:
先看你写的日志代码行:
log.info("start sendEmailOrders: " + factoryEmails != null ? String.valueOf(factoryEmails.size()) : "0");
Java里字符串拼接运算符+的优先级比三元运算符?:高,所以这行代码的实际执行逻辑完全不是你想的那样:
- 首先会执行
"start sendEmailOrders: " + factoryEmails,哪怕factoryEmails是null,拼接后也会得到"start sendEmailOrders: null"这个非null字符串 - 接着判断这个拼接后的字符串是否不等于null——结果永远是true
- 最后执行三元运算符的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
相关产品推荐
相关产品推荐

