欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java常量字符串過長報錯的解決辦法以及原因分析

 更新時間:2023年01月30日 11:16:18   作者:gusangg  
在IDEA中字符串長度超過65535,進行打印,IDEA會提示java:常量字符串過長,這篇文章主要給大家介紹了關于java常量字符串過長報錯的解決辦法以及原因分析,需要的朋友可以參考下

1.發(fā)生問題的場景

我在用java獲取一個接口的大JSON字符串,并賦值給String常量時,遇到了java: 常量字符串過長這個報錯

2.解決問題

2.1 可以使用StringBuilder(線程不安全)或StringBuffer(線程安全,即append方法被synchronize修飾)的append方法來拼接一個String,最后再通過toString()方法轉為String即可

2.2 也可以使用 += 符號來拼接字符串,在javac中,String的 += 符號被重載為了StringBuilder的append方法,有興趣的可以去了解一下

3.問題的原因

那么為啥會報這個問題呢?翻閱jvm規(guī)范發(fā)現:

在java中,常量String的結構體如下,其中的string_index指針指向常量池的一個條目,這個條目的結構體格式為CONSTANT_Utf8_info

我們來看這個CONSTANT_Utf8_info 結構體,由下圖可知一個String類型的常量的最大長度為2^16-1,但事實真的如此嗎?

經過測試,我發(fā)現實際最多存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保存的最大字節(jié)數為0xFFFF-1即2^16-2 ?。?!

最后挖個坑,不知道為啥StringBuilder、StringBuffer、+=符號是如何讓String動態(tài)增長的?

4.參考

1.java String 到底有多長?String超出長度怎么解決?

2.字符串String的+和+=及循環(huán)操作String的原理

總結

到此這篇關于java常量字符串過長報錯解決的文章就介紹到這了,更多相關java常量字符串過長報錯內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

最新評論