在查看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之间的值(更多讨论herehere和许多其他地方)。当Integer.valueOf()的参数表示范围内的数字时,parseInt()将从该缓存返回一个对象。该注释警告警告valueOf()一定不能依赖null,因为前者可能在填充该缓存之前被调用。

没有指定在这种情况下可能发生的不当行为,并且可以想象在Java版本之间可能会有所不同,但是可能的可能性是将返回NullPointerException或抛出异常(IndexOutOfBoundsExceptionInteger,...)。

无论如何,这是实现中的内部注释,而不是对Integer.valueOf()类的用户的注释。在任何用户代码运行时,必需的缓存初始化已完成,并且ojit_code可以完全依靠its API documentation的描述来运行。

关于java - 为什么parseInt警告使用valueOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44636759/

10-10 23:08