java常量字符串过长报错的解决办法以及原因分析
1.发生问题的场景
我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符串过长这个报错
2.解决问题
2.1 可以使用StringBuilder(线程不安全)或StringBuffer(线程安全,即append方法被synchronize修饰)的append方法来拼接一个String,最后再通过toString()方法转为String即可
2.2 也可以使用 += 符号来拼接字符串,在javac中,String的 += 符号被重载为了StringBuilder的append方法,有兴趣的可以去了解一下
3.问题的原因
那么为啥会报这个问题呢?翻阅jvm规范发现:
在java中,常量String的结构体如下,其中的string_index指针指向常量池的一个条目,这个条目的结构体格式为CONSTANT_Utf8_info
我们来看这个CONSTANT_Utf8_info 结构体,由下图可知一个String类型的常量的最大长度为2^16-1,但事实真的如此吗?
经过测试,我发现实际最多存2^16-1-1个字符,这是为什么呢?我先去下载了javac的源码(在lib/scr.zip中),我在\lib\src\jdk.compiler\com\sun\tools\javac\jvm|Gen.java中看到了:
而这个PoolWriter.MAX_STRING_LENGTH的值为:
所以可以得出,javac允许常量String保存的最大字节数为0xFFFF-1即2^16-2 !!!
最后挖个坑,不知道为啥StringBuilder、StringBuffer、+=符号是如何让String动态增长的?
4.参考
1.java String 到底有多长?String超出长度怎么解决?
2.字符串String的+和+=及循环操作String的原理
总结
到此这篇关于java常量字符串过长报错解决的文章就介绍到这了,更多相关java常量字符串过长报错内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java中List Set和Map之间的区别_动力节点Java学院整理
Java集合的主要分为三种类型set集,list列表,map映射,接下来通过本文给大家详细介绍java中list、Set和Map之间的区别,需要的的朋友参考下吧2017-05-05SpringBoot实现自定义注解用于文件验证的详细过程(大小、扩展名、MIME类型)
SpringBoot,Spring Cloud中经常需要处理文件上传的功能,为了确保上传的文件满足特定的要求(如扩展名、MIME类型和文件大小),我们可以创建一个自定义注解来简化验证过程,需要的朋友可以参考下2024-08-08
最新评论