暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java异常信息中只打印NullPointerException,却不输出堆栈信息的原因终于知道了

全栈的程序员 2023-03-01
4190

项目期比较忙,很久没更新了,趁着有时间给大家做一则实际项目中的排查问题分享。

有一次排查线上问题的时候,发现一直再报空指针的错误信息,但是只有错误名称。没有堆栈信息,大家都懂,没有错误的堆栈信息,只能盲猜啊。压根不知道哪一行报错,报错的原因是什么。所以需要先想办法,让程序将堆栈信息打印出来,或者找到报错的堆栈信息才是解决问题的正确思路,这样一来就变成了两个问题。

1. 解决找不到报错堆栈信息的原因,并解决。

2. 通过报错信息解决实际bug。

好了,有了思路就开始下面的阅读并思考问题。

问题现象:

程序日志中大量打印异常,但是只有

    java.lang.NullPointerException
    复制

    没有更详细的信息,期初还以为打印日志的代码写的不规范。如图所示

    问题原因:

    是因为jvm进行了优化,如频繁的抛出某个异常,会重新编译,不再打印异常堆栈。此时要找堆栈就得到最开头去找了。。。可是最开头可能在几天前,可能日志早就被清理了。

    问题解决步骤:

    启动jar包时在 启动参数加上 


      -XX:-OmitStackTraceInFastThrow
      复制

      禁用该优化,强制打印异常堆栈。当然这会损耗性能且日志过大咯

      排查过程:

      • 首先看下logger日志打印是否规范,如下所示:

      log.info("打印的日志是:{}",eee);
      复制


      log.error("数据格式有问题",e);
      复制


      • 再看线上版本是否和线下版本不一致,保证线上线下代码一致,就不需要排查。

      • 最后看下是否频繁报错,对号入座。





      文章转载自全栈的程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论