返回顶部
首页 > 资讯 > 后端开发 > JAVA >java: 常量字符串过长 报错的解决方法及原因
  • 468
分享到

java: 常量字符串过长 报错的解决方法及原因

javajvm开发语言 2023-10-08 12:10:14 468人浏览 八月长安
摘要

文章目录 1.发生问题的场景2.解决问题3.问题的原因4.参考 1.发生问题的场景 我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符

文章目录

1.发生问题的场景

我在用java获取一个接口的大JSON字符串,并赋值给String常量时,遇到了java: 常量字符串过长这个报错

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的原理

来源地址:https://blog.csdn.net/weixin_43957537/article/details/127141232

--结束END--

本文标题: java: 常量字符串过长 报错的解决方法及原因

本文链接: https://lsjlt.com/news/425294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作