生产与本地环境NullPointerException日志内容不一致问题排查
生产与本地环境MessageDigest抛出NPE的日志差异原因及配置方案
生产环境中Java内置MessageDigest类抛出的NullPointerException日志如下:
java.lang.NullPointerException: Cannot read the array length because "<parameter1>" is null
本地环境对应的日志内容为:
java.lang.NullPointerException: Cannot read the array length because "<input>" is null
已知生产与本地均使用Eclipse Temurin 17.0.15+6版本Java,且了解增强NPE提示的相关特性,推测差异源于编译方式,但未明确具体原因,需明确差异来源并配置本地环境匹配生产日志格式。
差异原因
核心差异在于编译时是否保留方法参数名称信息:
- 增强的NPE提示逻辑中,若编译生成的class文件保留了方法的原始参数名称,会直接使用该参数名(如MessageDigest相关方法的
parameter1)生成提示; - 若编译时未保留参数名称,就会使用默认占位符
<input>。
生产环境代码编译时启用了参数名称保留,而本地编译未开启该选项,导致日志提示不同。
本地环境配置方案
Maven项目
在pom.xml的maven-compiler-plugin中添加<parameters>配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>17</source> <target>17</target> <parameters>true</parameters> <!-- 开启参数名称保留 --> </configuration> </plugin> </plugins> </build>
Gradle项目
在build.gradle中添加参数保留配置:
java { options.parameters = true }
手动javac编译
直接添加-parameters编译参数:
javac -parameters YourClass.java
配置完成后重新编译代码,触发相同NPE场景,即可验证日志是否显示<parameter1>,实现与生产环境日志格式一致。
内容的提问来源于stack exchange,提问作者AndreasInfo
相关产品推荐
相关产品推荐

