You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生产与本地环境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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.10 05:02:37