为什么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( NullPointerExceptionIndexOutOfBoundsException ,…)。

无论如何,这是实现中的内部注释,而不是类Integer用户的评论。 当任何用户代码运行时,必要的高速caching初始化完成, Integer.valueOf()可以依赖其API文档描述的完全行为。

源代码(几乎)仅供参考,javadoc不包含该警告,因为它仅供Java本身的开发人员使用。

这可能是一个警告,因为有人使用valueOf方法编码可以在内部caching初始化之前调用parseInt方法的某些问题或错误。

换句话说,这个警告不适合你,假设你没有改变Integer类!