java常量字符串过长报错的解决办法以及原因分析
作者:gusangg 发布时间:2023-10-18 10:15:25
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的原理
来源:https://blog.csdn.net/weixin_43957537/article/details/127141232
猜你喜欢
- /** * 三角数字: * 比达哥斯拉领导下的古希腊数学家发现了一个有趣的数字序列1, 3, 6, 10, 15, 21,... *
- 在网上很多关于dubbo异常统一处理的博文,90%都是抄来抄去。大多都是先上一段dubbo中对于异常的统一处理的原码,然后说一堆的(甚至有1
- Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的<
- Java持久化框架:Hibernate与MybatisHibernate和Mybatis是两个Java持久化框架,用于将Java对象映射到关
- 新公司工程是用Maven管理的,技术上使用了JPA,但是我导入工程到MyEclipse时,applicationContext.xml中提示
- import java.text.ParseException;import java.text.SimpleDateFormat;impo
- SpringBoot 配置SwaggerUI 访问404的小坑。在学习SpringBoot构建Restful API的时候遇到了一个小坑,配
- Nacos是什么和Eureka,zookeeper,consul相同,Nacos也是一个注册中心组件咯,当然是,不过它不仅仅是注册中心。Na
- 本文介绍C#编程时,给定一个字符串,如何判断它是不是一个日期。本文将介绍两种方法,一个是判断字符串是否是时间,如果是就转换为一个时间变量,第
- 这篇文章主要介绍了Spring @Transactional注解失效解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较
- 记得我在以前找工作的经历中,遇到过一个面试官问过我一个很基础的问题。问题是:有一个List中有10个元素,我现在想从中删除3个元素,请问怎么
- 1. 概述官方JavaDocsApi: javax.swing.JLabelJLabel,标签。标签主要用于展示 文本 或 图片,也可以 同
- 参考:How to catch an Exception from a threadIs there a way to make Runna
- Maven 组件界面介绍 如上图标注 1 所示,为常用的 Maven 工具栏,其中最常用的有:第一个按钮:Reimport All
- 前言现在是移动端产品疯狂的年代,随之,移动端支付也是热门小技能,最近本公司在做一个移动端,要接入微信支付和支付宝支付, * 惯,功能做完之后做
- mybatis的原身是ibatis,现在已经脱离了apache基金会,新官网是http://www.mybatis.org/。在研究Myba
- 这篇文章介绍了Java+Nginx实现POP、IMAP、SMTP邮箱代理服务,我们本次使用的环境为Centos7下,java程序我们通过ec
- 今天做了一个java对象转Map的例子,执行的时候报错了,如下:Exception in thread "main" j
- 被kafka-client和springkafka版本坑上周刚刚欢天喜地的在linux上部了kafka,这周打算用spring-boot框架