Slf4j的log.debug方法在函数Bean内部抛出空指针异常问题咨询
问题根因分析
你遇到的空指针异常不是Slf4j的logger对象为null导致的,问题出在日志内容的拼接环节:
ConcurrentLinkedQueue的poll()方法在队列没有元素时会直接返回null- 你在日志字符串拼接时直接调用了
sysEvt.toString(),当sysEvt为null时就会触发NPE,还没执行到log.debug方法本身就已经抛出异常,所以会出现误以为是log对象异常的假象。
修复方案
两种常用修复方案可二选一:
- 先判空再打印日志,同时使用Slf4j占位符规避空指针风险:
@Bean public Supplier<Event> msgSender() { return () -> { Event sysEvt = eventq.poll(); if (sysEvt != null) { log.debug(" Msg polled from Cloud Stream and Sent: {}", sysEvt); } return sysEvt; }; }
说明:占位符语法{}不仅能避免手动调用toString()的空指针风险,当日志级别高于debug时还会跳过对象序列化步骤,性能优于字符串拼接写法。
- 用Java 8+的
Optional简化判空逻辑:
@Bean public Supplier<Event> msgSender() { return () -> { Event sysEvt = eventq.poll(); Optional.ofNullable(sysEvt) .ifPresent(evt -> log.debug(" Msg polled from Cloud Stream and Sent: {}", evt)); return sysEvt; }; }
内容的提问来源于stack exchange,提问作者Thiru
相关产品推荐
相关产品推荐

