记一次线上空指针问题排查
前言
今天收到一封告警邮件, 内容如下
com.example.dubbo.filter.ExceptionFilter#invoke [traceId] [DubboServerHandler-thread-19] [DUBBO] Got unchecked and undeclared exception which called by ip. service: com.example.TestService, method: testMethod, exception: java.lang.NullPointerException: null, dubbo version: 2.6.9, current host: ip
java.lang.NullPointerException: null
只有一个 npe 的信息, 看到这里我是懵逼的, 完全不知道怎么会事, 还好我们有 traceId
排查问题
查找日志
直接登录 elk, 搜索 traceId, 跟着调用链一路向下走, 然后还是把我看吐了, 一开始直接用 elk 的按时间排序, 降序排序, 跟了半天代码, 越看越不对劲, 排序后的内容如下图

elk 的排序是根据左边的 日志时间 来排序的, 但它并不是日志打印的时间, 真正的打印日志的时间应该是右边 message 那里的, 因为这个疏忽, 导致看了好久日志硬是没看出来问题
查看代码
在明白这个 日志时间 的坑后, 通过手动按照时间排序, 终于找出了正确的调用链, 最后的最后, 问题锁定在了一行代码上:

其它地方全都做了判空处理, 只有这里可能出现问题
复现问题
稍微写一个 demo, idea 直接有警告了

执行一下, 果然报错了

错误提示也是只有一个 npe
结语
在用 Steam 提供的便捷操作时要注意判空😰

浙公网安备 33010602011771号