一次java.lang.NullPointerException的排查之旅

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【1月更文挑战第6天】一次java.lang.NullPointerException的排查之旅

问题由来

最近在项目中遇到了一个比较奇怪的java.lang.NullPointerException,就是说在自己的本地环境中,功能正常,运行无异常。但是测试环境点击同样的功能时却总是对应的字段查不到数据,但是数据库中这个字段又是有数据的,测试环境的效果就像这样

image.png

那么这个问题究竟是怎么产生的呢?

问题分析

既然测试环境不好使,那么首先回到本地环境看一下这个功能是否正常,启动本地项目后,点击对应功能的功能页面看到效果

image.png

说明自己本地功能时没有问题的,那么测试环境为什么对应字段有数据但是却一直查不出数据呢?查看测试环境服务器的日志打印,整体上的日志并没有什么异常之处,但是仔细查看日志会找到有一段异常信息

序列化出错java.lang.NullPointerException

image.png

那么回到对应的controller   OrderClueRuleController.java 查看对应156行内容

image.png

为了更好的打印错误日志,在本地项目中这里将异常信息通过 e.printStackTrace(); 打印出来。本地项目执行之后的日志如图

image.png

并没有异常信息,到这里怀疑是否是本地代码与测试环境代码不一致导致的。于是重新更新了本地代码,终于复现了问题,本地打印了异常信息代码行数

image.png

我们在对应的OrderClueRuleController.java:149 打上debug再次查看具体问题

image.png

入参是没有问题的,入参有值,这是注意到了一点

image.png

在service   sysService后面跟了一个NullPointerException,选中sysService bean查看为 null

image.png

到这里问题基本也就明了了,下面开始处理问题。

问题处理

基于上面的问题分析,基本也定位到了问题所在,sysService  bean为null,那么sysService为什么会为空呢?查看更新的代码就找到了问题,sysService 的 @Autowired 注解丢失了。@Autowired 注解的作用是如果在一个类中声明了 @Autowired 注解,那么 Spring 容器会自动帮助我们创建一个 Bean 并注入到该类中,现在其实 sysService  bean是没有注入到 controller OrderClueRuleController 中的,因此就有了这个问题。最后其实发现这个@Autowired 注解本来是有的,只是在代码合并的时候处理冲突导致丢失了。


最后,其实这样的问题并不难排查,只是往往不太会往这个方向想,并且代码编译、启动都没有报错。通常情况下遇到这样的java.lang.NullPointerException 异常都会想到入参是否未传,而不太会去注意入参的调用 bean是否为 null。

这里补充一下 @Autowired 和 @Resource 注解在注入类时的小区别:

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。默认按照Bean的类型进行装配。

@Resource:与@Autowired作用相同, 区别在于:@Aautowired默认按照Bean类型装配,而@Resource默认按照Bean的实例名称进行装配。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
6月前
|
Java 数据库连接
Java中的内存泄漏排查与预防方法
Java中的内存泄漏排查与预防方法
|
8月前
|
SQL 网络协议 Java
Java开发者的必备技能:抓包工具排查问题
Java开发者的必备技能:抓包工具排查问题
350 0
|
SQL 关系型数据库 MySQL
Java 最常见的面试题:mysql 问题排查都有哪些手段?
Java 最常见的面试题:mysql 问题排查都有哪些手段?
|
4月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到内存不足时会抛出OutOfMemoryError(OOM)异常。常见OOM情况包括:1) **Java堆空间不足**:大量对象未被及时回收或内存泄漏;2) **线程栈空间不足**:递归过深或大量线程创建;3) **方法区溢出**:类信息过多,如CGLib代理类生成过多;4) **本机内存不足**:JNI调用消耗大量内存;5) **GC造成的内存不足**:频繁GC但效果不佳。解决方法包括调整JVM参数(如-Xmx、-Xss)、优化代码及使用高效垃圾回收器。
187 15
常见java OOM异常分析排查思路分析
|
6月前
|
监控 Java
Java中的内存泄漏分析与排查技巧
Java中的内存泄漏分析与排查技巧
|
4月前
|
缓存 JavaScript Java
常见java OOM异常分析排查思路分析
Java虚拟机(JVM)遇到 OutOfMemoryError(OOM)表示内存资源不足。常见OOM情况包括:1) **Java堆空间不足**:内存被大量对象占用且未及时回收,或内存泄漏;解决方法包括调整JVM堆内存大小、优化代码及修复内存泄漏。2) **线程栈空间不足**:单线程栈帧过大或频繁创建线程;可通过优化代码或调整-Xss参数解决。3) **方法区溢出**:运行时生成大量类导致方法区满载;需调整元空间大小或优化类加载机制。4) **本机内存不足**:JNI调用或内存泄漏引起;需检查并优化本机代码。5) **GC造成的内存不足**:频繁GC但效果不佳;需优化JVM参数、代码及垃圾回收器
105 6
常见java OOM异常分析排查思路分析
|
5月前
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
447 1
【Java】服务CPU占用率100%,教你用jstack排查定位
|
8月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
74 0
|
8月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
166 0
|
6月前
|
Prometheus 监控 Cloud Native
Java 服务挂掉,服务器异常宕机问题排查
Java 服务挂掉,服务器异常宕机问题排查
1088 1