Java compiler error: constant string too long

Java compiler error: constant string too long

最近项目中遇到解析图片的base64字符串需求,在测试时遇到了error: constant string too long这个错误,代码如下:

String base64 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAKoCAYAAABZ..."

注意,这里实际上的字符串长度为752378,这里为了节省篇幅,只能简写。
长度如何查看呢?将光标至于字符串末尾,然后查看Android Studio下方,如下图所示,冒号后面的为总大小。然后再减去多余字符即可。

752406 - (26 + 2) = 752378

运行代码之后,报错如下:

为了不干扰测试,将这段字符串写到资源文件strings.xml中,然后再获取即可规避这个错误,代码如下:

String base64 = getResources().getString(R.string.string_base64);

这样就不会报错了,继续测试即可。

错误原理分析:

我们报的错是编译期错误,编译器提示我们String常量的长度太长。我们知道,通过双引号定义的字符串都会被放进常量池的,会不会是常量池对字符串大小做了限制?运行时会不会也有这个限制?

参考Size of Initialisation string in java,Java中对String字面值的限制是65535。

基于此,我们先进行如下测试,

    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < 65536; i++) {
        sb.append("a");
    }
    String result = sb.toString();
    System.out.println(result);

运行结果OK,不会报异常,说明运行时对字符串的长度限制不是65534。

接下来测试我们尝试着将双引号定义字符串长度设为65535附近的值,校验下Java中对String字面值的限制是否准确。

我们先设置字符串常量的长度为65535,会发现依然报这个错误,如下图:

接下来设置字符串常量的长度为65534,发现编译成功,如下图:

在此我们可以得出结论,Java compiler error: constant string too long这个错误的出现,是因为字符串常量值的长度超过了65534,编译期检查没通过。运行时不存在这个限制,运行时的内存限制走的是堆内存,跟CPU分配内存相关。

这个错误如何规避呢?在Android中,将这个字符串写入资源文件,然后在运行期间获取即可规避这个限制。

参考:
https://netbeans.org/bugzilla/show_bug.cgi?id=212752
https://stackoverflow.com/questions/8323082/size-of-initialisation-string-in-java
Java中String接受的最大字符串的长度是多少

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tinyvampirepudge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值