> 技术文档 > IDEA 编译报错 “java: 常量字符串过长” 的解决办法

IDEA 编译报错 “java: 常量字符串过长” 的解决办法


目录

    • 一、问题描述
    • 二、问题原因
      • 2.1 理论角度
      • 2.2 源码角度
    • 三、解决方案
      • 解决方案①:StringBuilder 拼接
      • 解决方案②:读取文件内容
    • 四、方案验证

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

  • 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText

一、问题描述

今天在开发过程中,由于尝试将一个文件的 Base64 字符串设置为常量,结果导致 IDEA 编译的时候出现了如下报错:

  • java: 常量字符串过长

IDEA 编译报错 “java: 常量字符串过长” 的解决办法


二、问题原因

2.1 理论角度

在 Java 中,常量字符串过长的问题通常是 由于编译器对字符串常量的长度有限制 导致的。

众所周知,Java代码是由 Java编译器(javac) 编译为 class 字节码之后运行的。这个报错就是因为 javac 对字符串常量有一个上线,通常是 65534 个字符串。这个限制是由于 Java 编译器在处理字符串常量时,使用了 16位 的无符号证书来表示字符串的长度,因此最大值为 2^16 - 1 = 65535,但实际使用中会减去一个字符的空间用于其他用途,所以最大长度为 65534。

在 IDEA 中编写代码时,如果定义了一个超过 65534 个字符的字符串常量,编译器就会报错:java: 常量字符串过长

  • JVM 规范文档: https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.3

查看 JVM 规范文档可以看到:在 Java 中,常量 String 的结构体如下:

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

其中 string_index 指针指向常量池的一个条目,这个条目的结构体格式为 CONSTANT_Utf8_info。这个结构体的定义如下所示:

IDEA 编译报错 “java: 常量字符串过长” 的解决办法