为什么parseInt警告使用valueOf

Mic*_*el 51 java

在查看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.
*/
Run Code Online (Sandbox Code Playgroud)

虽然我理解了关于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);
}
Run Code Online (Sandbox Code Playgroud)

并且应该从之前的断言错误中保存.

Joh*_*ger 55

有人可以解释一下这个评论的确切含义(以及不应该使用valueOf的上下文),以及可能出现的问题.

Integer类创建和维护的高速缓存Integer代表小整数值的对象; 默认情况下,覆盖-128到127范围内的值(此处更多讨论,此处和许多其他地方). Integer.valueOf()当其参数表示范围中的数字时,将从此缓存返回一个对象.注释是警告,parseInt()必须不依赖,valueOf()因为前者可能在填充该缓存之前被调用.

可能在这种情况下,预期的不当行为未指定,并设想的Java版本之间可能会有所不同,但合理的可能性是null会被退回或异常(NullPointerException,IndexOutOfBoundsException,...)将被抛出.

无论如何,这是实现中的内部注释,而不是对类用户的注释Integer.当任何用户代码运行时,必要的缓存初始化完成,并且Integer.valueOf()可以依赖完整行为,如其API文档所述.


use*_*421 37

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

这可能是一个警告,因为有人使用该valueOf方法编写parseInt可在内部缓存初始化之前调用的方法导致某些问题或错误.

换句话说,假设您没有更改Integer类,那么警告不适合您!