当前位置: 首页 > news >正文

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录

    • 一、问题描述
    • 二、问题原因
      • 2.1 理论角度
      • 2.2 源码角度
    • 三、解决方案
      • 解决方案①:StringBuilder 拼接
      • 解决方案②:读取文件内容
    • 四、方案验证

  • 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText

一、问题描述

今天在开发过程中,由于尝试将一个文件的 Base64 字符串设置为常量,结果导致 IDEA 编译的时候出现了如下报错:

  • java: 常量字符串过长

在这里插入图片描述


二、问题原因

2.1 理论角度

在 Java 中,常量字符串过长的问题通常是 由于编译器对字符串常量的长度有限制 导致的。

众所周知,Java代码是由 Java编译器(javac) 编译为 class 字节码之后运行的。这个报错就是因为 javac 对字符串常量有一个上线,通常是 65534 个字符串。这个限制是由于 Java 编译器在处理字符串常量时,使用了 16位 的无符号证书来表示字符串的长度,因此最大值为 2^16 - 1 = 65535,但实际使用中会减去一个字符的空间用于其他用途,所以最大长度为 65534。

在 IDEA 中编写代码时,如果定义了一个超过 65534 个字符的字符串常量,编译器就会报错:java: 常量字符串过长

  • JVM 规范文档: https://docs.oracle.com/javase/specs/jvms/se19/html/jvms-4.html#jvms-4.4.3

查看 JVM 规范文档可以看到:在 Java 中,常量 String 的结构体如下:

在这里插入图片描述

其中 string_index 指针指向常量池的一个条目,这个条目的结构体格式为 CONSTANT_Utf8_info。这个结构体的定义如下所示:

在这里插入图片描述

  • 由上图可知,一个 String 类型的常量的最大长度为 2^16 - 1 = 65535,但实际使用中会减去一个字符的空间用于其他用途,所以最大长度为 65534

2.2 源码角度

下面我们再从 javac 源码角度进行分析,源码下载地址:https://jdk.java.net/java-se-ri/8-MR6。

\lib\src\jdk.compiler\com\sun\tools\javac\jvm|Gen.java 中可以看到如下代码:

而这个 PoolWriter.MAX_STRING_LENGTH 的值为:

从代码可以看到,要求小于 2^16-1,所以得出 javac 允许常量 String 保存的最大字节数为 0xFFF-1,即 2^16-1-1=65534


三、解决方案

解决方案①:StringBuilder 拼接

我们可以使用 StringBuilder 进行字符串拼接的方式来解决这个问题,只要每次拼接的长度不超过 65534 即可。

public static String getConstant() {StringBuilder builder = new StringBuilder();builder.append("字符串1");builder.append("字符串2");// ...return builder.toString();
}
  • 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText

解决方案②:读取文件内容

还有一种方式是将字符串写入文件后读出来,如下所示:

try (BufferedReader reader = new BufferedReader(new FileReader("longString.txt"))) {StringBuilder builder = new StringBuilder();String line;while ((line = reader.readLine() != null)) {builder.append(line);}String longString = builder.toString();
} catch (IOException e) {e.printStackTrace();
}

除了两种方式,其余几种方式小编亲试均无效:

  • 使用加号连接字符串
  • 使用换行符
  • 使用Eclipse编译器

四、方案验证

我们先创建一个 65535 长度的字符串试一下,结果如下所示,不出意外地报错了:

在这里插入图片描述

下面我们去掉一个字符,长度调整为 65534,再次执行,就可以正常打印了,如下图所示:

在这里插入图片描述

现在我们已经确定当长度超过 65534 的时候就会报错了,那么我们将长度改为 65535,然后使用 StringBuilder 来实现,结果如下所示:

在这里插入图片描述

整理完毕,完结撒花~ 🌻





参考地址:

1.java: 常量字符串过长 报错的解决方法及原因,https://blog.csdn.net/weixin_43957537/article/details/127141232

相关文章:

IDEA 编译报错 “java: 常量字符串过长” 的解决办法

目录 一、问题描述二、问题原因2.1 理论角度2.2 源码角度 三、解决方案解决方案①:StringBuilder 拼接解决方案②:读取文件内容 四、方案验证 在线文本换行工具: https://lzltool.cn/Toolkit/WrapWordsInText 一、问题描述 今天在开发过程中…...

RK3568平台开发系列讲解(I2C篇)I2C 总线实现 client 设备方法

🚀返回专栏总目录 文章目录 一、非设备树实现 i2c client1.1、i2c_new_device1.2、i2c client二、设备树实现 i2c2.1、i2c_client 结构体的生成2.2、i2c_driver 驱动2.2.1、module_i2c_driver2.2.2、fan53555_regulator_probe沉淀、分享、成长,让自己和他人都能有所收获!�…...

K8S安装和部署

环境部署说明 主机IPmaster172.25.254.100node10172.25.254.10node20172.25.254.20harbor172.25.254.233 所有节点禁用selinux和防火墙 所有节点同步时间和解析 所有节点安装docker-ce 所有节点禁用swap,注意注释掉/etc/fstab文件中的定义 解析配置(…...

Singleton(单例模式)

1. 意图 在开发中,若某些模块或功能只需要一个类实例,所有调用地方通过着一个类对象访问功能,单例模式符合这种类实例创建模式,并且通过提供统一类实例接口访问类对象。 2. 适用性 《Gof 设计模式-可复用面向对象软件的基础》中对…...

【Linux报错】“-bash: cd: too many arguments“

问题描述 今天使用 cd 想要调整某个文件目录时,发现以下报错 原因分析: arguments 是参数的意思,该报错提示参数过多,意味着系统识别到了多余参数 本质原因:你的命令中输入了多余的 ”空格“ ,检查一…...

C# WebService返回参数为DataTable报错“XML文档有错误”

该问题由于DataTable列存在自定义类型。 解决该报错需要以下几步: 1、自定义类型增加xml序列化 2、由于C#从 XML 反序列化 DataSet 或 DataTable 时的默认限制,所以需要先把调用方的项目开放限制,如果是.netframework项目,需要…...

[paddle]paddleseg快速开始

快速开始 为了让大家快速了解PaddleSeg,本文档使用一个简单示例进行演示。在实际业务中,建议大家根据实际情况进行调整适配。 在开始下面示例之前,请大家确保已经安装好PaddleSeg开发环境(安装说明)。 1 准备数据 …...

UNIAPP popper气泡弹层【unibest框架下】vue3+typescript

看了下市场的代码,要么写的不怎么好,要么过于复杂。于是把市场的代码下下来了自己改。200行代码撸了个弹出层组件。兼容H5和APP。 功能: 1)只支持上下左右4个方向的弹层不支持侧边靠齐 2)不对屏幕边界适配 3)支持弹层外边点击自动隐藏 4)支持…...

launcher.py: error: the following arguments are required: --output_dir

记录一个LLaMA-Factroy配置过程。 安装 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e ".[torch,metrics]"训练 CUDA_VISIBLE_DEVICES0 llamafactory-cli train example/train_lora/.yaml按理说配置好文件应…...

C语言基础之结构体

今天我们来讲讲C语言基础的最后一个知识点了 —— 结构体。不知道大家对前面的C语言基础的知识点掌握的怎么样了呢?下面我们就开始讲解结构体的相关知识点吧! 什么是结构体呢?或者说结构体有什么作用呢?对于复杂对象来说&#xff…...

Redis入门第四步:Redis发布与订阅

欢迎继续跟随《Redis新手指南:从入门到精通》专栏的步伐!在本文中,我们将深入探讨Redis的发布与订阅(Pub/Sub)模式。这是一种强大的消息传递机制,适用于各种实时通信场景,如聊天应用、实时通知和…...

MySQL 之权限与授权

MySQL 权限及授权系统用于控制数据库用户对数据库资源的访问和操作权限。它提供了一种细粒度的安全控制机制,确保只有被授权的用户才能执行特定的操作。MySQL 的权限控制体系非常灵活,支持多种权限类型及级别(数据库、表、列、存储过程等&…...

解决方案:Pandas里面的loc跟iloc,有什么区别

文章目录 一、现象二、解决方案案例使用loc使用iloc 简单总结 一、现象 在用Pandas库处理数据的时候,久而久之不用loc跟iloc,难免会有些混乱记混 二、解决方案 在Pandas中,loc和iloc是两种常用的数据选择方法,它们的主要区别在…...

C# 和 C++ 混合编程

以下是一个关于 C# 和 C 混合编程 的教程详细目录,涵盖了混合编程中的各个重要方面: 目录 1. 引言 1.1 什么是混合编程? 1.2 为什么选择 C# 和 C 进行混合编程? 1.3 应用场景和优势 2. 基本概念 2.1 C# 和 C 的基础差异 2.…...

Vxe UI vue vxe-table 实现表格单元格选中功能

Vxe UI vue vxe-table 实现表格单元格选中功能 在表格中实现鼠标点击任意单元格,选取的功能,通过 mouse-config 配置就可以开启单选功能,多选单元格选取功能需安装插件支持。 代码 参数说明 mouse-config 鼠标配置项: selected&…...

组合模式详解

1、组合模式基本介绍 1) 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以 表示“整体-部分”的层次关系。 2) 组合模式依据树形结构来组合对象,用来表示部…...

AltiumDesigner脚本开发-DIP封装制作

1.点击工具栏的运行工具(蓝色向右三角图标)可以执行脚本程序; 2.点击菜单栏Run->Run可以执行脚本程序; 3.在脚本编辑器中,按键盘的F9键可以执行脚本程序; 4.通过菜单栏执行脚本程序(需要将程序添加到菜单栏中&am…...

乌班图基础设施安装之Mysql8.0+Redis6.X安装

简介:云服务器基础设施安装之 Mysql8.0Redis6.X 安装 Docker安装 # 按照依赖 yum install -y yum-utils device-mapper-persistent data lvm2 Docker Mirror 从去年开始. hub.docker.com[1] 在国内的访问速度极慢. 当时大家主要还是依赖国内的一些镜像源: 如中科…...

【动态规划-最长递增子序列(LIS)】力扣673.最长递增子序列的个数

给定一个未排序的整数数组 nums , 返回最长递增子序列的个数 。 注意 这个数列必须是 严格 递增的。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。 示例 2: 输入: [2,2,2,2,2] 输出: 5 解释:…...

SQL优化 where谓词条件is null优化

1.创建测试表及谓词条件中包含is null模拟语句 create table t641 as select * from dba_objects; set autot trace select SUBOBJECT_NAME,OBJECT_NAME from t641 where OBJECT_NAMEWRI$_OPTSTAT_SYNOPSIS$ and SUBOBJECT_NAME is null; 2.全表扫描逻辑读1237 3.创建等值谓词条…...

UniApp地图开发避坑指南:在nvue页面里搞定iconfont、动态缩放和点聚合的完整流程

UniApp地图开发实战:nvue页面中的高级技巧与性能优化 1. 引言:为什么选择nvue进行地图开发? 在移动应用开发领域,地图功能已经成为许多应用的核心组件。UniApp作为跨平台开发框架,提供了map组件来实现地图功能&#xf…...

SAP MIRO发票校验时,如何用增强LMR1M001自动检查供应商号?

SAP MIRO发票校验中供应商号自动检查的增强实战指南 在SAP系统中,发票校验(MIRO)是财务流程中的关键环节,而供应商号的准确性直接关系到后续的付款和账务处理。想象一下这样的场景:采购部门创建了一个采购订单,但财务人员在录入发…...

从DICOM到3D打印:手把手教你用3D Slicer处理医学影像全流程(含STL导出)

从DICOM到3D打印:医学影像处理全流程实战指南 在数字化医疗时代,将CT、MRI等医学影像转化为可触摸的3D打印模型,正在成为临床教学、手术规划和医患沟通的革命性工具。这套技术链条中最关键的桥梁,正是开源的3D Slicer平台——它能…...

HTTPS握手失败?别慌!手把手教你用OpenSSL和Wireshark排查TLS与Cipher Suites问题

HTTPS握手失败?别慌!手把手教你用OpenSSL和Wireshark排查TLS与Cipher Suites问题 当你面对浏览器中那个刺眼的"SSL Handshake Failed"错误时,是否感到无从下手?作为经历过数百次HTTPS故障排查的老兵,我深知这…...

VSCode Mermaid Preview:面向技术团队的实时图表协作解决方案

VSCode Mermaid Preview:面向技术团队的实时图表协作解决方案 【免费下载链接】vscode-mermaid-preview Previews Mermaid diagrams 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-mermaid-preview 在技术文档编写、系统架构设计和项目规划过程中&…...

APM32F407移植uC/OS-III实战:从源码到多任务运行全解析

1. 项目概述与核心价值最近在捣鼓一块APM32F407的开发板,想给它跑个实时操作系统,选来选去,最终决定上手uC/OS-III。对于很多从单片机裸机编程转向RTOS的工程师来说,这个选择很典型:uC/OS-III源码开放、结构清晰、文档…...

MySql学习杂谈 --- “连接“”

第一步:忘掉所有术语,记住一个生活场景 想象你要做一件事:查全班同学的考试成绩 表A(同学名单):张三,李四,王五,赵六 表B(考试成绩)&#xff1…...

别再死记硬背Transformer了!用大白话和代码图解,5分钟搞懂Self-Attention核心

用图书馆借书的故事讲透Transformer自注意力机制 想象你走进一个巨大的图书馆,书架上摆满了各种书籍。你需要找到一本关于"深度学习"的书,但你不确定具体是哪一本。这时候,图书管理员会怎么做?她会根据你的需求&#xf…...

免费本地语音识别的终极解决方案:3步实现完全离线实时语音转文字

免费本地语音识别的终极解决方案:3步实现完全离线实时语音转文字 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 在数字化办公和在线学习日益普及的今天,你是否还在为云端语音识别服务的隐私…...

告别手动描图!用AutoCAD Civil 3D 2024快速搞定两期土方横断面对比(附模板)

告别手动描图!用AutoCAD Civil 3D 2024快速搞定两期土方横断面对比(附模板) 在土木工程领域,土方量计算是项目成本控制与进度管理的关键环节。传统CAD手动绘制横断面的方式不仅耗时费力,更难以应对设计变更带来的反复修…...