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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java中List Set和Map之間的區(qū)別_動力節(jié)點Java學院整理
Java集合的主要分為三種類型set集,list列表,map映射,接下來通過本文給大家詳細介紹java中l(wèi)ist、Set和Map之間的區(qū)別,需要的的朋友參考下吧2017-05-05java中extends與implements的區(qū)別淺談
java中extends與implements的區(qū)別淺談,需要的朋友可以參考一下2013-03-03SpringBoot實現自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)
SpringBoot,Spring Cloud中經常需要處理文件上傳的功能,為了確保上傳的文件滿足特定的要求(如擴展名、MIME類型和文件大?。?我們可以創(chuàng)建一個自定義注解來簡化驗證過程,需要的朋友可以參考下2024-08-08