资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: 计算机考试归档 最新发布

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

文章目录

    • 1.发生问题的场景
    • 2.解决问题
    • 3.问题的原因
    • 4.参考

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中),我在libsrcjdk.compilercomsuntoolsjavacjvm|Gen.java中看到了:

而这个PoolWriter.MAX_STRING_LENGTH的值为:
所以可以得出,javac允许常量String保存的最大字节数为0xFFFF-1即2^16-2 !!!

最后挖个坑,不知道为啥StringBuilder、StringBuffer、+=符号是如何让String动态增长的?

4.参考

1.java String 到底有多长?String超出长度怎么解决?
2.字符串String的+和+=及循环操作String的原理

转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1096843.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【java: 常量字符串过长 报错的解决方法及原因】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2