为什么parseInt警告使用valueOf
当查看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); }
并应该从之前的断言错误保存。
有人可以解释评论警告我什么(和valueOf不应该使用的上下文),什么可能会出错。
Integer
类创build并维护一个表示小整数值的Integer
对象caching; 默认情况下,覆盖范围在-128到127之间的值( 在 这里以及其他许多地方有更多的讨论)。 当参数表示范围中的数字时, Integer.valueOf()
将从此caching中返回一个对象。 注释警告parseInt()
不能依赖于valueOf()
因为前者可能在填充caching之前被调用。
在这种情况下可能会出现的错误行为没有被指定,并且可能在Java版本之间有所不同,但是合理的可能性是返回null
或者抛出exception( NullPointerException
, IndexOutOfBoundsException
,…)。
无论如何,这是实现中的内部注释,而不是类Integer
用户的评论。 当任何用户代码运行时,必要的高速caching初始化完成, Integer.valueOf()
可以依赖其API文档描述的完全行为。
源代码(几乎)仅供参考,javadoc不包含该警告,因为它仅供Java本身的开发人员使用。
这可能是一个警告,因为有人使用valueOf
方法编码可以在内部caching初始化之前调用parseInt
方法的某些问题或错误。
换句话说,这个警告不适合你,假设你没有改变Integer类!