在查看Integer.parseInt(String s, int radix)
(java 8,1.8.0_131)的源代码时,我发现以下注释块:
/*
* 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);
}
并且应该从断言错误之前保存。
最佳答案
Integer
类创建并维护表示小整数值的Integer
对象的缓存;默认情况下,覆盖范围-128到127之间的值(更多讨论here,here和许多其他地方)。当Integer.valueOf()
的参数表示范围内的数字时,parseInt()
将从该缓存返回一个对象。该注释警告警告valueOf()
一定不能依赖null
,因为前者可能在填充该缓存之前被调用。
没有指定在这种情况下可能发生的不当行为,并且可以想象在Java版本之间可能会有所不同,但是可能的可能性是将返回NullPointerException
或抛出异常(IndexOutOfBoundsException
,Integer
,...)。
无论如何,这是实现中的内部注释,而不是对Integer.valueOf()
类的用户的注释。在任何用户代码运行时,必需的缓存初始化已完成,并且ojit_code可以完全依靠its API documentation的描述来运行。
关于java - 为什么parseInt警告使用valueOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44636759/