这个问题是编译时错误,在 Java 的运行时没有这个限制。

当我们在 Java 编译器中输入的变量值超过 64 KB 的话,Java 编译器是不会让编译通过的,你将会得到一个 constant string too long” error from the compiler 错误。

在本文中,我们将会对这个问题的原因进行解释和如何解决这个问题。

问题描述

首先让我们在本地的计算机中重复这个问题,在下面的代码中,插入一个超长的字符串。

@Test
public void whenDeclaringTooLongString_thenCompilationError() {String stringTooLong = "stringstringstring ... 100,000 characters ... string";  assertThat(stringTooLong).isNotEmpty();
}

上面输入的字符串超过了 100,000 个字符。因为我们是为了测试使用的,你可以在代码中输入任何很长的字符。

有时候你的 IDE 可能不会提示这个错误,但是我们测试的 IEDA 是没有问题的,这个错误能够完全提示出来。

当然可以使用 maven 来进行编译,相同的代码,如果使用 Maven 进行编译的提示如下:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:06 min
[INFO] Finished at: 2022-08-06T09:34:08-04:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:testCompile (default-testCompile) on project core-java-strings: Compilation failure
[ERROR] /D:/WorkDir/Repository/GitHub/cwiki-us-docs/java-tutorials/core-java-modules/core-java-strings/src/test/java/com/ossez/stringtoolong/StringTooLongUnitTest.java:[16,32] constant string too long
[ERROR]
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :core-java-strings

在使用 UTF-8 编码的时候,类文件的字符被限制在 2^16 bytes。

问题解决

因为这个问题是编译时错误,不是运行时问题。

解决这个问题的办法也就非常简单了,如果你需要处理超长的字符串的话,我们可以使用 FileInputStream 的方法来进行处理。

将需要处理的字符串放到文件中就可以了。

然后让你的程序从文件中把数据读出来。

如下面的代码所示:

@Test
public void whenStoringInFileTooLongString_thenNoCompilationError() throws IOException {FileInputStream fis = new FileInputStream("src/test/resources/stringtoolong.txt");String stringTooLong = IOUtils.toString(fis, "UTF-8");assertThat(stringTooLong).isNotEmpty();
}

当然你也可以定义成一个属性文件中的值,这样的话,你可以通过读取属性文件方法把这个值取出来。

这种方法和上面一种方法的本质是一样的,就是用文件来替换掉。

@Test
public void whenStoringInPropertiesString_thenNoCompilationError() throws IOException {try (InputStream input = new FileInputStream("src/main/resources/config.properties")) {         Properties prop = new Properties();prop.load(input);String sValue = prop.getProperty("stringtoolong");assertThat(sValue).isNotEmpty();}
}

然后尝试对上面的代码再次进行重新编译,有关这个字符串过长的错误就解决了。

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.433 s
[INFO] Finished at: 2020-03-14T18:23:54+01:00
[INFO] ------------------------------------------------------------------------

当然,你也可以使用字符串拼接的方式,将希望处理的字符串进行拼接。

但并不十分推荐使用这种方法来进行处理。

结论

在本文中,我们对 constant string too long 编译错误进行了说明,并且提供了解决的方法。

简单来说就是使用文件来进行替换。

测试源代码

相关的测试源代码,请访问:

https://src.ossez.com/cwiki-us-docs/java-tutorials/src/branch/main/core-java-modules/core-java-strings/src/test/java/com/ossez/stringtoolong/StringTooLongUnitTest.java

您也可以 Fork 代码后提交更新。

Java “constant string too long” 编译错误 - Java - OSSEZ这个问题是编译时错误,在 Java 的运行时没有这个限制。 当我们在 Java 编译器中输入的变量值超过 64 KB 的话,Java 编译器是不会让编译通过的,你将会得到一个 constant string too long” error from the compiler 错误。 在本文中,我们将会对这个问题的原因进行解释和如何解决这个问题。 问题描述首先让我们在本地的计算机中重复这个问题,在下面的代码中,插入一个超长的字…https://www.ossez.com/t/java-constant-string-too-long/14048

Java “constant string too long” 编译错误相关推荐

  1. Error:java: 无效的标记 -version 编译错误的解决办法

    创建新项目,在启动的时候遇到了 Error:java: 无效的标记: -version 这个报错信息 截图如下: 说是在编译的时候遇到了问题,所以我check了下maven配置,Settings里的 ...

  2. java强制编译通过_强制java使用用户输入作为消息进行编译错误

    我不知道在Java中是否可行: 我想从用户(从System.in)获得输入,然后使用该输入引发编译错误. 我的意思是,如果用户输入了文本" HELLO",则程序应引发编译错误:编译 ...

  3. java使用cmd编译中文时错误,解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题...

    解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 解决Notepad++编写的Java程序在cmd窗口编译时中文注释报错问题 在刚开始学习Java的过程中,考虑到记事本应用没 ...

  4. java编译报错提示编码gbk的不可映射字符啥意思_解决java编译错误:编码GBK的不可映射字符...

    [我的Android进阶之旅]解决Android Studio 运行gradle命令时报错: 错误: 编码GBK的不可映射字符 1.问题描述 最近在负责公司基础业务和移动基础设施的开发工作,正在负责L ...

  5. java程序编译错误属于异常吗_“Cannot find symbol”编译错误是什么意思?

    "Cannot find symbol"编译错误是什么意思? 1."Cannot find symbol"错误是什么意思? 首先,它是编译错误1.这意味着,无论 ...

  6. java code large_Java中的“代码太大”编译错误(“Code too large” compilation error in Java)...

    Java中的"代码太大"编译错误("Code too large" compilation error in Java) Java中的代码是否有最大大小? 我写 ...

  7. PAT提交JAVA代码编译错误

    这是我在PAT在提交java代码时的一种编译错误,如下图所示 这种编译错误主要是由于在提交Java代码d的过程中格式出现错误,只需要在class后面的类名改成"Main"就可以了, ...

  8. Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案

    Eclipse Maven 编译错误 Dynamic Web Module 3.0 requires Java 1.6 or newer 解决方案 参考文章: (1)Eclipse Maven 编译错 ...

  9. java编译错误 程序包javax.servlet不存在javax.servlet.*

    java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...

最新文章

  1. 不同版本gene ID比较
  2. 信息安全系统设计基础学习总结第二周
  3. JS动态获取当前时间
  4. visualstudio2015无法打开包括文件stdio.h等
  5. 链表的基本操作——反转与删除
  6. 一张图学会Xmind创建思维导图【转载】
  7. webpack打包原理_对于webpack打包原理你知道有多少?
  8. Python 读入Excel表时如何判空NaN
  9. spring之IOC和DI关系
  10. Windows10鼠标光标及浏览器点击效果【win10美化】
  11. tkmybatis能连接oracle吗,《放弃Mybatis使用tkMybatis》
  12. 教你用Python 做PPT之制作动态图~做出来的效果高级又好看
  13. HIVE优化系列(1)-- 自动合并输出的小文件
  14. 网络爬虫之东方财富网股票板块
  15. 又一神作。Alibaba“M8级”架构师总结微服务与事件驱动架构启蒙手册
  16. overflow溢出处理
  17. 繁花盛开的夏天读后感
  18. 计算机应用基础在线试题,计算机应用基础试题.DOC
  19. 计算机应用基础网络统考t4,华南理工大学2019秋-计算机应用基础_随堂练习
  20. string数据库使用和实践第一部分string数据库介绍

热门文章

  1. 数字IC设计笔试题汇总(一)
  2. 如何优雅地给妹子优化电脑(Windows)?
  3. 图像采集卡的概念及作用原理
  4. 数字图像处理第九章 形态学图像处理
  5. 计算机论文免费模板,1.计算机专业毕业论文模板
  6. 联想台式修复计算机,联想台式电脑一键恢复5.0与Vista SP1兼容性问题预防及解决方案...
  7. Microsoft Windows Win32k本地提权漏洞分析
  8. scala-第六章-Rational
  9. 大话数据结构 摘录 第一章 数据结构绪论
  10. 微软旗下GitHub宣布裁员10%;谷歌高管警告:AI聊天机器人会产生错觉;华为称在ChatGPT领域早有布局丨每日大事件...