Java compiler error: constant string too long

简介: Java compiler error: constant string too long

Java compiler error: constant string too long

最近项目中遇到解析图片的base64字符串需求,在测试时遇到了error: constant string too long这个错误,代码如下:

String base64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAKoCAYAAABZ..."

注意,这里实际上的字符串长度为752378,这里为了节省篇幅,只能简写。
长度如何查看呢?将光标至于字符串末尾,然后查看Android Studio下方,如下图所示,冒号后面的为总大小。然后再减去多余字符即可。

752406 - (26 + 2) = 752378

运行代码之后,报错如下:

为了不干扰测试,将这段字符串写到资源文件strings.xml中,然后再获取即可规避这个错误,代码如下:

String base64 = getResources().getString(R.string.string_base64);

这样就不会报错了,继续测试即可。

错误原理分析:

我们报的错是编译期错误,编译器提示我们String常量的长度太长。我们知道,通过双引号定义的字符串都会被放进常量池的,会不会是常量池对字符串大小做了限制?运行时会不会也有这个限制?

参考Size of Initialisation string in java,Java中对String字面值的限制是65535。

基于此,我们先进行如下测试,

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 65536; i++) {
        sb.append("a");
    }
    String result = sb.toString();
    System.out.println(result);

运行结果OK,不会报异常,说明运行时对字符串的长度限制不是65534。

接下来测试我们尝试着将双引号定义字符串长度设为65535附近的值,校验下Java中对String字面值的限制是否准确。

我们先设置字符串常量的长度为65535,会发现依然报这个错误,如下图:

接下来设置字符串常量的长度为65534,发现编译成功,如下图:

在此我们可以得出结论,Java compiler error: constant string too long这个错误的出现,是因为字符串常量值的长度超过了65534,编译期检查没通过。运行时不存在这个限制,运行时的内存限制走的是堆内存,跟CPU分配内存相关。

这个错误如何规避呢?在Android中,将这个字符串写入资源文件,然后在运行期间获取即可规避这个限制。

参考:
https://netbeans.org/bugzilla/show_bug.cgi?id=212752
https://stackoverflow.com/questions/8323082/size-of-initialisation-string-in-java
Java中String接受的最大字符串的长度是多少

相关文章
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
36 0
java基础(13)String类
|
2月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
16天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
105 65
|
16天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第13天】Java零基础教学篇,手把手实践教学!
36 1
|
21天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
21 2
|
27天前
|
Java
让星星⭐月亮告诉你,Java异常分类[Throwable(Error/Exception(RuntimeException/其他异常)) 检查时异常 非检查时异常]
本文深入解析了Java异常处理机制,重点介绍了`Throwable`类及其子类`Error`和`Exception`,并通过实例代码、流程图和表格详细解释了异常的分类、区别及处理方法,帮助读者掌握异常处理的关键技巧,提升程序的稳定性和健壮性。
45 1
|
1月前
|
IDE Java 开发工具
Java“未封闭的 String 表达式”怎么解决
要解决Java中的“未封闭的 String 表示”问题,需检查并修正字符串字面量,确保每个字符串被正确地用双引号括起来。若字符串跨越多行,可使用字符串连接操作符(+)或引入文本块(JDK 13 及以上版本)。这能帮助避免语法错误,并使代码更整洁易读。
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
24 2
|
2月前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
下一篇
无影云桌面