你居然問兩個完全不同的問題在這裏,所以他們必須單獨處理。
1.爲什麼new StringBuffer(Integer.MAX_VALUE)
會拋出一個OutOfMemoryError
?
構造函數StringBuffer
試圖實例化一個數組char
,其大小是您傳遞的值。所以你隱式地嘗試實例化一個大小爲Integer.MAX_VALUE
的數組。有兩個原因可能導致實例化數組。
第一個原因是,你真的沒有足夠的堆空間。不知道你的程序中還有什麼事情發生,或者你的堆設置是什麼,我不可能知道這是否會發生在你身上。但是,啓動它時,您可以爲您的JVM選擇最大堆大小,使用-Xmx
選項。顯然,假設你的計算機有足夠的內存,你需要將它設置爲幾千兆字節才能使其正常工作(例如-Xmx8g
)。
在實例化數組時,OutOfMemoryError
的第二個原因是您已經超出了最大數組大小。這絕對是在這裏發生的。最大數組大小不是由Java語言規範定義的,並且它從JVM到JVM都不相同。在大多數現代JVM中,最大陣列大小爲Integer.MAX_VALUE - 2
,但有JVM最大爲Integer.MAX_VALUE - 5
或Integer.MAX_VALUE - 8
。無論如何,Integer.MAX_VALUE
確實已超出限制。
2.爲什麼new StringBuffer(Integer.MAX_VALUE + 16)
會拋出NegativeArraySizeException
?
這是關於Java中的整數運算。任何int
值必須介於Integer.MIN_VALUE
和Integer.MAX_VALUE
之間。此外,當您添加兩個int
值時,答案由Java語言規範保證爲3210 Integer.MAX_VALUE + 16`,您不會得到數學上正確的答案。實際上,Java所做的就是運行mod 2 。查看它的另一種方法是JVM將添加或減去2的倍數以使答案在正確的範圍內。
這意味着Integer.MAX_VALUE + 16
的值實際上在數值上等於,這是一個很大的負數。正如我前面提到的,StringBuffer
構造函數試圖實例化一個數組,其大小是您傳遞的值。這種嘗試實例化負數大小的數組會給您帶來NegativeArraySizeException
。
詮釋溢出... – user2717954
閱讀了有關整數溢出 – QBrute
1:*** Integer.MAX_VALUE的+ 16 ***的是,產生負數→無效參數 –