当前位置: 代码网 > it编程>编程语言>Java > IDEA编译报错“java: 常量字符串过长”的原因及解决方法

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

2025年02月23日 Java 我要评论
在线文本换行工具: https://lzltool.cn/toolkit/wrapwordsintext一、问题描述今天在开发过程中,由于尝试将一个文件的 base64 字符串设置为常量,结果导致 i

在线文本换行工具: https://lzltool.cn/toolkit/wrapwordsintext

一、问题描述

今天在开发过程中,由于尝试将一个文件的 base64 字符串设置为常量,结果导致 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 的结构体如下:

在这里插入图片描述

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

在这里插入图片描述

由上图可知,一个 string 类型的常量的最大长度为 2^16 - 1 = 65535,但实际使用中会减去一个字符的空间用于其他用途,所以最大长度为 65534。

2.2 源码角度

下面我们再从 javac 源码角度进行分析,源码下载地址:https://jdk.java.net/java-se-ri/8-mr6

\lib\src\jdk.compiler\com\sun\tools\javac\jvm|gen.java 中可以看到如下代码:

而这个 poolwriter.max_string_length 的值为:

从代码可以看到,要求小于 2^16-1,所以得出 javac 允许常量 string 保存的最大字节数为 0xfff-1,即 2^16-1-1=65534

三、解决方案

解决方案①:stringbuilder 拼接

我们可以使用 stringbuilder 进行字符串拼接的方式来解决这个问题,只要每次拼接的长度不超过 65534 即可。

public static string getconstant() {
    stringbuilder builder = new stringbuilder();
    builder.append("字符串1");
    builder.append("字符串2");
    // ...
    return builder.tostring();
}

解决方案②:读取文件内容

还有一种方式是将字符串写入文件后读出来,如下所示:

try (bufferedreader reader = new bufferedreader(new filereader("longstring.txt"))) {
    stringbuilder builder = new stringbuilder();
    string line;
    while ((line = reader.readline() != null)) {
        builder.append(line);
    }
    string longstring = builder.tostring();
} catch (ioexception e) {
    e.printstacktrace();
}

除了两种方式,其余几种方式小编亲试均无效:

  • 使用加号连接字符串
  • 使用换行符
  • 使用eclipse编译器

四、方案验证

我们先创建一个 65535 长度的字符串试一下,结果如下所示,不出意外地报错了:

在这里插入图片描述

下面我们去掉一个字符,长度调整为 65534,再次执行,就可以正常打印了,如下图所示:

在这里插入图片描述

现在我们已经确定当长度超过 65534 的时候就会报错了,那么我们将长度改为 65535,然后使用 stringbuilder 来实现,结果如下所示:

在这里插入图片描述

整理完毕。

到此这篇关于idea编译报错“java: 常量字符串过长”的原因及解决方法的文章就介绍到这了,更多相关java常量字符串过长内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com