问一个日志不打印栈信息的问题

2 天前
 ainyyy

部分代码如下:

		
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResult.fail("系统异常");
        }

日志文件中显示

2025-11-07 09:43:23.128 [http-nio-20001-exec-934] ERROR StoreOrderServiceImpl:557 - null
java.lang.NullPointerException: null 

然后就结束了, 最近出了好多这种问题. 打印空指针,但是完全没有栈相关信息

1164 次点击
所在节点    Java
10 条回复
mulychou
2 天前
问题在于:e.getMessage() 可能为 null 。
例如,在 NullPointerException 没有具体 message 时,e.getMessage() 返回 null 。于是日志输出时会变成:
null
java.lang.NullPointerException: null
此时虽然异常对象 e 传入了,但很多日志框架(例如 logback 或 log4j2 )在第一个参数是 null 时会只打印异常类型,而不打印堆栈。
直接使用占位符打印日志吧,例如:
log.error("Error occurred: {}", e.getMessage(), e);
Goooooos
2 天前
java 的 JIT 会优化掉一部分异常的堆栈,尤其是 NPE

启动参数加上-XX:-OmitStackTraceInFastThrow 可以禁用 fast throw 优化
JYii
2 天前
正常输出应该是先打印 exception 的 message ,然后紧跟堆栈信息,现在没有,那不就是如 1L 所说。而且 log.error 的第一个参数应是自定义的消息模板,不该直接放异常信息。
luoke99
2 天前
是不是由自己封装的异常类触发的,我们之前有个项目就是封装了一个 BizException,有个家伙把 fillInStackTrace() 重写了,导致 log 不会打印异常栈
Wh1te
2 天前
这是 JVM 的 OmitStackTraceInFastThrow 优化.RuntimeException 频繁出现,就会省略掉堆栈,比如 NullPointerException ClassCastException ArrayIndexOutOfBoundsException 等等.
你往前找到最开始出现这个异常的日志,那里就有堆栈信息
Need4more
2 天前
#2 、#5 正解
jvm 针对高频异常会复用预分配实例以提升性能。若需完整堆栈,需显式禁用参数-XX:-OmitStackTraceInFastThrow
prosgtsr
2 天前
我们也有这个问题,学习了
Edward4074
1 天前
前阵子也碰到这个问题,问下 AI 就好了
ainyyy
23 小时 27 分钟前
@Edward4074 cursor 代码扫了几遍,告诉我代码没问题. 感觉就是上面说的 jvm 的问题.
Edward4074
21 小时 6 分钟前
@ainyyy 是 jvm 问题没错。我想说的是提问方式,既然代码没问题,那问题就来到了“什么情况下 npe 不打印堆栈信息”,然后 AI 就会回答上面的 JVM 优化问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1171249

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX