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

JDK1.8中String.length()空指针异常排查及复现咨询

异常成因与复现方案

核心成因

这是因为非null的String实例内部的私有char数组value被置为null导致的。

虽然AbstractStringBuilder.append()方法会先做str == null的空检查,但如果传入的str是一个合法的String对象,但其内部存储字符的value数组被反射、字节码修改等非常规手段改成了null,调用str.length()时(该方法直接返回value.length)就会触发NullPointerException,完全绕过了外层的空判断。

可复现的代码示例

通过反射修改String的内部value字段即可复现该场景:

import java.lang.reflect.Field;

public class BrokenStringTest {
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        String targetStr = "初始字符串";
        
        // 反射获取String类的私有value字段
        Field valueField = String.class.getDeclaredField("value");
        valueField.setAccessible(true);
        // 将value字段置为null,破坏String的内部结构
        valueField.set(targetStr, null);
        
        // 执行append操作触发异常
        StringBuilder sb = new StringBuilder();
        sb.append(targetStr);
    }
}

运行后会抛出与你一致的异常栈:

java.lang.NullPointerException
at java.lang.String.length(String.java:623)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:447)
at java.lang.StringBuilder.append(StringBuilder.java:141)
at BrokenStringTest.main(BrokenStringTest.java:14)

补充说明

  • 这种场景属于破坏Java核心类结构的非常规操作,正常业务代码不会出现,通常是测试、框架代码中使用反射/字节码工具时误操作导致的。
  • 你提到打印字符串时程序崩溃,是因为String的所有核心方法(包括toString())都依赖内部的value数组,当value为null时,任何访问它的方法都会触发NPE,无法正常输出内容。

内容的提问来源于stack exchange,提问作者Mobility

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:52:35