2017-06-19 38 views
49

的當在源代碼中尋找Integer.parseInt(String s, int radix)(Java 8,1.8.0_131),我發現下面的註釋塊:爲什麼parseInt函數警告使用的valueOf

/* 
* WARNING: This method may be invoked early during VM initialization 
* before IntegerCache is initialized. Care must be taken to not use 
* the valueOf method. 
*/ 

雖然我瞭解了IntegerCache第一部分,我不明白爲什麼有關於valueOf的警告,以及爲什麼在這種情況下。

我看到valueOf()依賴於parseInt(),但我仍然不明白爲什麼會有這個警告。

有人可以解釋評論警告我什麼(以及不應該使用valueOf的上下文)什麼,以及可能出現什麼問題。

編輯:

在Integer.valueOf代碼(int i)以自似乎從下面的評論的另一個問題已經改變了有人問,現在是

public static Integer valueOf(int i) { 
    if (i >= IntegerCache.low && i <= IntegerCache.high) 
     return IntegerCache.cache[i + (-IntegerCache.low)]; 
    return new Integer(i); 
} 

,應該從節約之前的斷言錯誤。

+1

可能重複[爲什麼在Integer類的Integer.valueOf方法中使用斷言?](https://stackoverflow.com/questions/33891156/why-is-assert-used-in-the-integer- valueof-method-of-integer-class) – Blasanka

+1

assert似乎並未在java8 Integer中使用。valueOf()@Blasanka,你可以解釋一下重複的投票嗎,或者指向那些仍然等於在僞指針中鏈接的代碼的代碼? – Michael

回答

53

有人可以解釋什麼意見警告我(和valueOf不應該使用的上下文)什麼可能出錯。

Integer類創建並維護代表小整數值的對象的緩存; Integer類代表小對象的緩存;默認情況下,覆蓋範圍-128到127的值(更多討論here,here和許多其他地方)。當Integer.valueOf()的參數表示範圍內的數字時,將從此緩存中返回一個對象。該註釋警告parseInt()不得依賴於valueOf(),因爲前者可能在填充緩存之前被調用。

,可能在這種情況下,可以預期的不良行爲未指定,並設想的Java版本之間可能會有所不同,但合理的可能性是null將返回或異常(NullPointerExceptionIndexOutOfBoundsException,...)將會被拋出。

在任何情況下,這是實現中的內部註釋,而不是類Integer的用戶的評論。在任何用戶代碼運行時,必要的高速緩存初始化完成,並且可以依賴Integer.valueOf()充分表現爲its API documentation所描述的行爲。

36

源代碼(幾乎)僅供參考,javadoc不包含該警告,因爲它僅用於Java本身的開發人員。

這可能是一個警告,因爲有人使用valueOf方法對parseInt方法進行編碼而導致某些問題或錯誤,該方法可在內部高速緩存初始化之前調用。

換句話說,假設你沒有改變Integer類,那個警告不適合你!

+1

謝謝,BTW很好的問題 - 沒有意識到這個警告 –

+0

當我讀它時,我非常困惑...:D – Michael

+0

如果你是Integer的子類,這絕對是你需要知道的東西。 –

相關問題